有時僅用於指定具有一個索引的數組非常有用。在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_嘗試過,但我無法用相對簡單的語法來完成它。
有時僅用於指定具有一個索引的數組非常有用。在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_嘗試過,但我無法用相對簡單的語法來完成它。
你可以嘗試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.]])
你可以做到這一點使用列表索引:
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)
還有一個專門爲[this]製作的功能(http://docs.scipy.org/doc/numpy/reference/generated/numpy.diag_indices.html)。 – Daniel
對角線賦值的例子只是一個例子。我在問如何使用或多或少在matlab中使用的語法 –
另一種方式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.]])
這是之前在這裏討論: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
嗯,他們似乎都沒有提到'arr.flat'屬性。 – seberg
我比其他兩個人更喜歡這個問題。它簡明扼要地提出了這個問題。 – kazemakase