如果您不知道阵列的形状,是否有一种简单的方法可以拉出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要求感兴趣。
答案 0 :(得分:3)
您可以使用.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
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:1)
上述答案将有效。但是,您也可以使用:
arr.reshape(-1)[0]