Python Numpy:与Matlab一样的赋值和索引

Python Numpy:与Matlab一样的赋值和索引,python,numpy,indexing,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_ux,但我无法用相对简单的语法实现这一点。您可以使用列表索引: M = np.zeros((4,4)) M[rang

有时,只分配一个索引的数组很有用。在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_ux,但我无法用相对简单的语法实现这一点。

您可以使用列表索引:

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)

您可以尝试,它表示一个迭代器,您可以使用它读取和写入数组

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

另一种使用unlavel_索引的方法

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

还有一个函数是专门为它设计的。对角线赋值的例子就是一个例子。我在问如何使用Matlab中使用的或多或少相同的语法这在这里讨论过:这里:嗯,它们似乎都没有提到
arr.flat
属性。我比其他两个更喜欢这个问题。它简明扼要地说明了问题所在。谢谢!这正是我要找的。我要的是C,不是fortran顺序,它不完全一样。的确。我对答案进行了编辑,以指出这一差异。