2016-01-26 137 views
3

如果您不知道數組的形狀,是否有簡單的方法可以取出ndarray的第一項?查找未知形狀的numpy ndarray的第一個元素

例如。鑑於以下數組:

arr = np.array([[[1,2,3,4], [5,6,7,8], [9,10,11,12]]]) 

>>> [[[ 1 2 3 4] 
     [ 5 6 7 8] 
     [ 9 10 11 12]]] 

我想1而不承擔我知道這個數組的形狀是1 * 3 * 4。

我也有意儘量減少解決方案的內存和CPU要求。

回答

3

您可以使用.ravel()得到ndarray的平面視圖,然後[0]提取的第一要素,像這樣 -

arr.ravel()[0] 

請注意,.flatten()會創建一個副本,所以在內存方面可能不是一個好主意,即使它仍然會給你正確的結果。

一種方法來檢查操作是否創建copyview是用np.may_share_memory內存共享標記檢查,像這樣 -

In [15]: np.may_share_memory(arr.flatten(),arr) 
Out[15]: False # Not sharing memory means a copy 

In [16]: np.may_share_memory(arr.ravel(),arr) 
Out[16]: True # Sharing memory means a view 

看來,人們也可以使用.flat得到一個視圖。


似乎存在np.take一個優雅的選擇 -

np.take(arr,0) # Input array is arr, 0 is the index position 
+1

'ravel'還將創建,如果數組的內存佈局ISN副本C-contiguous。最好使用'arr.flat [0]'或'arr.take(0)',這取決於你想要一個NumPy標量還是一個普通的Python標量。這些選項從不需要複製。 – user2357112

+0

@ user2357112嗯,這是非常有用的信息。謝謝! – Divakar

2

我建議flatten然後取件[0]

arr = np.array([[[1,2,3,4], [5,6,7,8], [9,10,11,12]]]) 

>>> [[[ 1 2 3 4] 
     [ 5 6 7 8] 
     [ 9 10 11 12]]] 

arr.flatten()[0] 

>>> 1 
+1

'np.flatten'在性能和內存使用情況而言不是很大,因爲它返回數組的副本,而不是一個視圖 –

1

以上答案會工作。但是,你也可以使用:

arr.reshape(-1)[0] 
3

,我已經到目前爲止,發現使用item()方法的最快方法:

>>> arr = np.array([[[1,2,3,4], [5,6,7,8], [9,10,11,12]]]) 
>>> arr.item(0) 
1 

要知道,雖然,它的值轉換爲Python對象,因此性能可能取決於數據類型以及您使用的Python版本。

>>> type(arr.item(0)) 
int 

下一個最快的是arr.flat[0]。它具有返回numpy類型的優點。

>>> arr.flat[0] 
1 
>>> type(arr.flat[0]) 
numpy.int64