2014-02-23 31 views
1

有人可以簡單地向我解釋這個表達嗎?你怎麼能取兩個值的範圍並將它們設置爲零?花式索引使用範圍?

lena_image[range(xmax), range(ymax)] = 0 
+0

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html –

+0

如果'xmax!= ymax'這個表達式會引發一個錯誤。 –

回答

2

range(n)產生從0包容n獨家列表:

In [847]: range(3) 
Out[847]: [0, 1, 2] 

和numpy的花哨索引需要在指數X S和Y S中的元素,並分配一個新的價值對他們說:

In [856]: d 
Out[856]: 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]]) 

In [857]: d[range(5), range(5)]=2 #assigns elems on diagonal d[0,0], d[1,1], d[2,2], etc. 
    ...: print d 
[[ 2. 0. 0. 0. 0.] 
[ 0. 2. 0. 0. 0.] 
[ 0. 0. 2. 0. 0.] 
[ 0. 0. 0. 2. 0.] 
[ 0. 0. 0. 0. 2.]] 

注意必有的X S和Y S中相同的數字在這種情況下

如果你想修改block(未對角線這段時間),使用廣播

In [878]: arange(3)[:, None] #get a 2D array of shape (3, 1) 
Out[878]: 
array([[0], 
     [1], 
     [2]]) 

In [874]: d[arange(3)[:, None], arange(2)] #get the sub array of row 0~2, col 0~1 
Out[874]: 
array([[ 2., 0.], 
     [ 0., 2.], 
     [ 0., 0.]]) 

In [875]: d[arange(3)[:, None], arange(2)]=100 #assign new values element-wise 

In [876]: d 
Out[876]: 
array([[ 100., 100., 0., 0., 0.], 
     [ 100., 100., 0., 0., 0.], 
     [ 100., 100., 2., 0., 0.], 
     [ 0., 0., 0., 2., 0.], 
     [ 0., 0., 0., 0., 2.]]) 
2

您的代碼將設置主對角線爲零:

import numpy as np 

n = 5 
lena_image = np.ones(shape=(n, n)) 
lena_image[range(n), range(n)] = 0 
print lena_image 

輸出:

[[ 0. 1. 1. 1. 1.] 
[ 1. 0. 1. 1. 1.] 
[ 1. 1. 0. 1. 1.] 
[ 1. 1. 1. 0. 1.] 
[ 1. 1. 1. 1. 0.]]