的「相同」的部分我考慮一個numpy的數組:不同形狀的ndarray
import numpy as np
b = np.empty((10,11,12))
現在我希望下面的形狀是相同的,但他們顯然不是:
>>> b[0,:,1].shape
>>> (11,)
和
>>> b[0][:][1].shape
>>> (12,)
有人可以給我解釋爲什麼形狀不同?我閱讀了關於編制索引的Numpy文檔,但是它表示編寫a[k][l]
與a[k,l]
相同。
的「相同」的部分我考慮一個numpy的數組:不同形狀的ndarray
import numpy as np
b = np.empty((10,11,12))
現在我希望下面的形狀是相同的,但他們顯然不是:
>>> b[0,:,1].shape
>>> (11,)
和
>>> b[0][:][1].shape
>>> (12,)
有人可以給我解釋爲什麼形狀不同?我閱讀了關於編制索引的Numpy文檔,但是它表示編寫a[k][l]
與a[k,l]
相同。
發生這種情況是因爲b[0][:]
是b[0]
的視圖,因此b[0][:][1]
確實是b[0, 1, :]
。一個數字例子可能有助於突出顯示發生了什麼:
In [5]: b = np.arange(3*4*5).reshape((3, 4, 5))
In [6]: b[0]
Out[6]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
In [7]: b[0, :]
Out[7]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
In [8]: b[0, :, 1]
Out[8]: array([ 1, 6, 11, 16])
In [10]: b[0][:]
Out[10]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
In [11]: b[0][:][1]
Out[11]: array([5, 6, 7, 8, 9])
In [13]: b[0, 1, :]
Out[13]: array([5, 6, 7, 8, 9])
In [32]: b[0][:, 1]
Out[32]: array([ 1, 6, 11, 16])
我想我現在明白了。 [:]給出數組的一個副本,但以這種方式使用它:b [0,:,1]表示在第一維中選擇第0個位置,在第二個維中選擇第一個位置,在第三個維中選擇第一個位置,對? – user9007131
除了一個普通的gotcha:與Python列表不同的是,'':''不會*淺拷貝'np.ndarray';相反,它給你一個原始數組的視圖:如果讓'c = b [:]'並更改'c'的任何部分,那麼'b'引用的內容也會改變。 – fuglede
那麼當處理numpy數組時,什麼是[:]呢?我可以忽略它,並總是在上面的例子中得到相同的結果。 – user9007131
但是,這並不適用於帶':'的'[:]'或表達式。 – hpaulj
在第二步中,評估'temp = b [0]'。然後'temp1 = temp [:]',然後'temp1 [1]'。也就是說,單獨的索引操作。 'b [0,:,1]'是一個索引操作,通過'numpy'作爲一個整體進行評估。嘗試匹配這兩個操作並不總是有用。 – hpaulj