花式索引时使用范围?

时间:2014-02-23 01:35:50

标签: python numpy scipy

有人可以用简单的语言向我解释这个表达吗?你怎么能取两个值的范围并将它们设置为零?

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

2 个答案:

答案 0 :(得分:2)

range(n)生成的列表范围从0包含到n不包括:

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

和numpy花式索引获取索引XY 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.]]

注意在这种情况下必须有相同数量的XY

如果您想修改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.]])

答案 1 :(得分: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.]]