2014-02-23 96 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

「同時遞增」。 啊!這是我錯過的核心概念。我沒有意識到它正在同時循環。這使得更多的意義!謝謝 –