Numpy: Assignment and Indexing as Matlab

后端 未结 3 1424
夕颜
夕颜 2021-01-13 13:36

Sometimes is useful to assign arrays with one index only. In Matlab this is straightforward:

M = zeros(4);
M(1:5:end) = 1
M =

   1   0   0   0
   0   1   0          


        
3条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-01-13 14:07

    You could try numpy.ndarray.flat, which represents an iterator that you can use for reading and writing into the array.

    >>> 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.]])
    

    Note that in numpy the slicing syntax is [start:stop_exclusive:step], as opposed to Matlab's (start:step:stop_inclusive).

    Based on sebergs comment it might be important to point out that Matlab stores matrices in column major, while numpy arrays are row major by default.

    >>> 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.]])
    

    To get Matlab-like indexing on the flattened array you will need to flatten the transposed array:

    >>> 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.]])
    

提交回复
热议问题