Numpy:分配和索引为Matlab

Pab*_*era 5 python indexing 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
Run Code Online (Sandbox Code Playgroud)

Numpy有办法做到这一点吗?首先,我想要展平数组,但该操作不会保留引用,因为它会复制.我尝试使用ix_但我无法用相对简单的语法来完成它.

kaz*_*ase 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.]])
Run Code Online (Sandbox Code Playgroud)

请注意,在numpy中,切片语法是[start:stop_exclusive:step],而不是Matlab(start:step:stop_inclusive).

基于sebergs注释,指出Matlab将矩阵存储在列major中可能很重要,而numpy数组默认为row major.

>>> 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.]])
Run Code Online (Sandbox Code Playgroud)

要在展平的数组上获得类似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.]])
Run Code Online (Sandbox Code Playgroud)

  • numpy是C,虽然不是fortran的顺序,但它并不完全相同. (3认同)