2013-12-19 69 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.]])