有时仅用于指定具有一个索引的数组非常有用。在Matlab中,这是直截了当的:Numpy:作为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_尝试过,但我无法用相对简单的语法来完成它。
有时仅用于指定具有一个索引的数组非常有用。在Matlab中,这是直截了当的:Numpy:作为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_尝试过,但我无法用相对简单的语法来完成它。
你可以尝试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的切片语法为[开始:stop_exclusive:工序],相对于Matlab的(开始:步骤: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.]])
你可以做到这一点使用列表索引:
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)
还有一个专门为[this]制作的功能(http://docs.scipy.org/doc/numpy/reference/generated/numpy.diag_indices.html)。 – Daniel
对角线赋值的例子只是一个例子。我在问如何使用或多或少在matlab中使用的语法 –
另一种方式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.]])
这是之前在这里讨论:HTTP ://stackoverflow.com/questions/3257619/numpy-interconversion-between-multidimensional-and-linear-indexing和在这里:http://stackoverflow.com/questions/15230179/how-to-get-the-linear-index -for-a-numpy-array-sub2ind – bla
嗯,他们似乎都没有提到'arr.flat'属性。 – seberg
我比其他两个人更喜欢这个问题。它简明扼要地提出了这个问题。 – kazemakase