2012-09-23 172 views
0

給定以下代碼,我期望最後兩行的行爲相同,但不這樣做。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.]]) 

問題是,爲什麼這兩種方法在分配上的行爲不同?我錯過了什麼?

(編輯:錯字)

回答

-1

編輯:不得不認識到,雖然我寫的東西是真實的,但事實上,D[0,0:2] = ...D[0,[0,1]] = ...(所以數組)不同的是,也許是真正的矛盾(以及相關的)。

也許是爲什麼發生這種情況,據我所知。選中此項:

D[0,[0,1]] = np.array([[1,2]]) 

給出相同的錯誤。問題是內部的切片操作發生在矩陣形狀再次「固定」到2D之前,這是因爲matrix是創建新視圖時發生的子類,但這裏是視圖是通常不需要的!

這意味着,當你設置這樣的元素,它總是表現得像:

C.A[0,[0,1]] = matrix([[1,2]]) # Note the C.A giving normal array view of C. 

哪個失敗,因爲矩陣是2D的,但C.A[0,[0,1]]是1D(因爲它不是「固定」是至少2D矩陣對象),在這種情況下,人們可以說,因爲它只是從右側的numpy中移除1維軸可能會容忍它,但只要它不需要矩陣對象做一個完全自定義的地方/賦值運算符,這可能不會很優雅。

但也許使用C.A等可以幫助解決這個不便。然而,在一般情況下,在numpy中,最好總是使用基類數組,除非你正在進行大量的矩陣乘法運算等等(在這種情況下,如果它僅限於程序的一部分,它可能更好地查看你的數組在矩陣之前,但在其他數組中工作)

+0

'D [0,[0,1]] = np.array([[1,2]])'失敗,因爲將2-D' ndarray'給出一個1-D'ndarray'(在這種情況下),右邊是2D。 –

+0

當然,但實際上1.'D [0,0:1] = np.array([[1,2]])工作,所以切片允許更多花式索引。事情是這樣的,對矩陣來說也是一樣的。對於這項任務本身,它不表現爲2-D。請注意,C [0,[0,1]] [n] = np.array([[1,2]])可用,因爲矩陣在賦值之前固定爲2維(我知道它不再是現場,如此廢話,但它證明了這一點)。 – seberg

+0

'矩陣'有一個自定義'__getitem__'來處理(大部分)。但這是'__setitem__',它的行爲與數組完全相同。 – seberg