有时仅为一个索引分配数组很有用。在Matlab中,这很简单:
M = zeros(4);
M(1:5:end) = 1
M =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Numpy有没有办法做到这一点?首先,我想要展平数组,但该操作不会保留引用,因为它会复制。我尝试使用ix_但我无法用相对简单的语法来完成它。
答案 0 :(得分:8)
您可以尝试numpy.ndarray.flat,它代表一个可用于读取和写入数组的迭代器。
>>> M = zeros((4,4))
>>> M.flat[::5] = 1
>>> print(M)
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
请注意,在numpy中,切片语法为[start:stop_exclusive:step],而不是Matlab(start:step:stop_inclusive)。
根据sebergs评论,指出Matlab将矩阵存储在专业列中可能很重要,而numpy数组默认为行专业。
>>> M = zeros((4,4))
>>> M.flat[:4] = 1
>>> print(M)
array([[ 1., 1., 1., 1.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
要在展平数组上获得类似Matlab的索引,您需要展平转置数组:
>>> M = zeros((4,4))
>>> M.T.flat[:4] = 1
>>> print(M)
array([[ 1., 0., 0., 0.],
[ 1., 0., 0., 0.],
[ 1., 0., 0., 0.],
[ 1., 0., 0., 0.]])
答案 1 :(得分:2)
您可以使用列表索引执行此操作:
M = np.zeros((4,4))
M[range(4), range(4)] = 1
print M
# [[ 1. 0. 0. 0.]
# [ 0. 1. 0. 0.]
# [ 0. 0. 1. 0.]
# [ 0. 0. 0. 1.]]
在这种情况下,您还可以使用np.identity(4)
答案 2 :(得分:1)
使用unravel_index
的另一种方法>>> M = zeros((4,4));
>>> M[unravel_index(arange(0,4*4,5),(4,4))]= 1
>>> M
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])