【发布时间】:2014-02-23 01:35:49
【问题描述】:
有人可以简单地向我解释一下这个表达吗?你怎么能取两个值的范围并将它们设置为零?
lena_image[range(xmax), range(ymax)] = 0
【问题讨论】:
-
如果
xmax != ymax,此表达式将引发错误。
有人可以简单地向我解释一下这个表达吗?你怎么能取两个值的范围并将它们设置为零?
lena_image[range(xmax), range(ymax)] = 0
【问题讨论】:
xmax != ymax,此表达式将引发错误。
您的代码会将主对角线设置为零:
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.]]
【讨论】:
range(n) 生成一个列表,范围从 0 包含到 n 不包含:
In [847]: range(3)
Out[847]: [0, 1, 2]
numpy 花式索引获取索引 Xs 和 Ys 处的元素,并为它们分配一个新值:
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.]]
注意在这种情况下Xs 和Ys 的数量必须相同
如果要修改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.]])
【讨论】: