給定以下代碼,我期望最後兩行的行爲相同,但不這樣做。NumPy:使用切片索引與列表分配給矩陣
import numpy as np
C = np.matrix(np.zeros((4,4)))
C[0, 0:2] = np.matrix([[1, 2]]) # Works as expected.
C[0, [0,1]] = np.matrix([[1, 2]]) # Throws an "array is not broadcastable to correct shape" error.
當使用ndarray
相反,工作的事情如預期(調整分配的右手邊的一維ndarray
):
D = np.zeros((4,4))
D[0, 0:2] = np.array([1, 2]) # Works as expected.
D[0, [0,1]] = np.array([1, 2]) # Works too.
而爲了讓事情變得怪異,如果一個人只索引矩陣C
(而不是分配給它),似乎使用的切片索引或列表剛剛返回相同的:
C[0, 0:2] # => matrix([[ 1., 2.]])
C[0, [0, 1]] # => matrix([[ 1., 2.]])
問題是,爲什麼這兩種方法在分配上的行爲不同?我錯過了什麼?
(編輯:錯字)
'D [0,[0,1]] = np.array([[1,2]])'失敗,因爲將2-D' ndarray'給出一個1-D'ndarray'(在這種情況下),右邊是2D。 –
當然,但實際上1.'D [0,0:1] = np.array([[1,2]])工作,所以切片允許更多花式索引。事情是這樣的,對矩陣來說也是一樣的。對於這項任務本身,它不表現爲2-D。請注意,C [0,[0,1]] [n] = np.array([[1,2]])可用,因爲矩陣在賦值之前固定爲2維(我知道它不再是現場,如此廢話,但它證明了這一點)。 – seberg
'矩陣'有一個自定義'__getitem__'來處理(大部分)。但這是'__setitem__',它的行爲與數組完全相同。 – seberg