如果您不知道數組的形狀,是否有簡單的方法可以取出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要求。
如果您不知道數組的形狀,是否有簡單的方法可以取出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要求。
您可以使用.ravel()
得到ndarray的平面視圖,然後鏈它[0]
提取的第一要素,像這樣 -
arr.ravel()[0]
請注意,.flatten()
會創建一個副本,所以在內存方面可能不是一個好主意,即使它仍然會給你正確的結果。
一種方法來檢查操作是否創建copy
或view
是用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
我建議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
'np.flatten'在性能和內存使用情況而言不是很大,因爲它返回數組的副本,而不是一個視圖 –
以上答案會工作。但是,你也可以使用:
arr.reshape(-1)[0]
,我已經到目前爲止,發現使用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
'ravel'還將創建,如果數組的內存佈局ISN副本C-contiguous。最好使用'arr.flat [0]'或'arr.take(0)',這取決於你想要一個NumPy標量還是一個普通的Python標量。這些選項從不需要複製。 – user2357112
@ user2357112嗯,這是非常有用的信息。謝謝! – Divakar