numpy:分配和索引为Matlab


问题内容

有时仅分配具有一个索引的数组很有用。在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中,切片语法为[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.]])