找到未知形状的numpy ndarray的第一个元素

时间:2016-01-26 19:48:40

标签: python arrays python-2.7 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要求感兴趣。

4 个答案:

答案 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]