2014-02-23 72 views
1

我开始使用numpy食谱自主学习numpy。我审查,并执行以下代码:使用numpy将范围设置为零

import scipy.misc 
import matplotlib.pyplot 

#This script demonstates fancy indexing by setting values 
#On the diagnols to 0 

#Load lena array 
lena = scipy.misc.lena() 
xmax = lena.shape[0] 
ymax = lena.shape[1] 

#Fancy indexing 
#can set ranges of points to zero, all at once instead of using loop 
lena[range(xmax), range(ymax)] = 0 
lena[range(xmax-1,-1,-1), range(ymax)] = 0 
matplotlib.pyplot.imshow(lena) 
matplotlib.pyplot.show() 

我明白在这个代码一切,除了:

​​

我读了索引和切片the documentation但仍无法让上面的代码感。这里是我的困惑点:

1)范围(xmax)和范围(ymax)包含整个x,y轴。不会将它们设置为零会使整个图像变黑?

2)range(xmax-1,-1,-1)是什么意思?

谢谢你们!

+1

没有在你的[上一个问题]的答案中解释#1(http://stackoverflow.com/questions/21963058/using-range-while-fancy-indexing)? #2可以用'help(range)'解释。 – DSM

回答

2

代码的第一位实际上是误导性的,并依赖于一个事实,即lena是一个正方形的图像:发生了什么,等效于调用zip(range(xmax), range(ymax)),然后每一个所产生的元组设置为0。你可以看看有什么可以去错在这里:如果xmax != ymax,那么事情将无法正常工作:

>>> test = lena[:,:-3] 
>>> test.shape 
(512, 509) 
>>> xmax, ymax = test.shape 
>>> test[range(xmax), range(ymax)] = 0 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: shape mismatch: objects cannot be broadcast to a single shape 

它可能会更好地界定diag_max = min(xmax, ymax),然后设置lena[range(diag_max), range(diag_max)] = 0

回答你的第二个问题是比较容易:range(from, to, step)range通用呼叫:

>>> range(1, 10, 2) 
[1, 3, 5, 7, 9] 
>>> range(1, 10, -2) 
[] 
>>> range(10, 1, -2) 
[10, 8, 6, 4, 2] 
>>> range(10, 0, -1) 
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 

特别是,这种逆转前面的列表,所以抓住对角线从右到左,而不是留下来对。

+0

“范围(从,到,步)是范围的一般要求:” 好吧,我混合了范围()和列表索引(它使用分号)。谢谢澄清,并在上面 –

2

'范围'会给你一个清单。尝试在你的REPL,看看会发生什么:

r = range(5) 
# r is no [0,1,2,3,4] 

所以做“莉娜[范围(XMAX),范围(YMAX)] = 0”将“莉娜”矩阵的对角线设置为零,因为您正在逐步增加x和y坐标。

'范围'很简单。 @JLLagrange的回答完美地回答了它。

+0

“同时递增”。 啊!这是我错过的核心概念。我没有意识到它正在同时循环。这使得更多的意义!谢谢 –