Python Numpy:与Matlab一样的赋值和索引
有时,只分配一个索引的数组很有用。在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
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顺序,它不完全一样。的确。我对答案进行了编辑,以指出这一差异。