2013-12-19 33 views
5

有时仅用于指定具有一个索引的数组非常有用。在Matlab中,这是直截了当的: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 

有没有办法在Numpy中做到这一点?首先,我认为要压扁数组,但该操作不保留引用,因为它会生成副本。我用ix_尝试过,但我无法用相对简单的语法来完成它。

+1

这是之前在这里讨论:HTTP ://stackoverflow.com/questions/3257619/numpy-interconversion-between-multidimensional-and-linear-indexing和在这里:http://stackoverflow.com/questions/15230179/how-to-get-the-linear-index -for-a-numpy-array-sub2ind – bla

+1

嗯,他们似乎都没有提到'arr.flat'属性。 – seberg

+3

我比其他两个人更喜欢这个问题。它简明扼要地提出了这个问题。 – kazemakase

回答

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的切片语法为[开始:stop_exclusive:工序],相对于Matlab的(开始:步骤: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.]]) 
+0

谢谢!这正是我所寻找的 –

+3

numpy是C,虽然不是fortran的顺序,但它不完全相同。 – seberg

+0

确实。我编辑了答案,指出了差异。 – kazemakase

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

还有一个专门为[this]制作的功能(http://docs.scipy.org/doc/numpy/reference/generated/numpy.diag_indices.html)。 – Daniel

+0

对角线赋值的例子只是一个例子。我在问如何使用或多或少在matlab中使用的语法 –

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