Numpy:分配和索引为Matlab

时间:2013-12-19 18:18:59

标签: python numpy indexing

有时仅为一个索引分配数组很有用。在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_但我无法用相对简单的语法来完成它。

3 个答案:

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