Python 查找形状未知的numpy数组的第一个元素
如果您不知道阵列的形状,是否有一种简单的方法可以拉出阵列的第一项 比如说。给定以下数组:Python 查找形状未知的numpy数组的第一个元素,python,arrays,python-2.7,numpy,Python,Arrays,Python 2.7,Numpy,如果您不知道阵列的形状,是否有一种简单的方法可以拉出阵列的第一项 比如说。给定以下数组: 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需求感兴趣。我建议采用element[0] arr = np.arr
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需求感兴趣。我建议采用element[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
您可以使用获取数据阵列的展平视图,然后将其与[0]
链接以提取第一个元素,如下所示-
arr.ravel()[0]
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
请注意,这将创建一个副本,因此在内存方面可能不是一个好主意,即使它仍然会给你正确的结果
检查操作是否正在创建副本
或视图
的一种方法是使用检查内存共享标志,如下所示-
arr.ravel()[0]
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
看起来,你也可以用它来获取视图
似乎有一个优雅的选择-
上面的答案会有用的。但是,您也可以使用:
arr.reshape(-1)[0]
到目前为止,我发现使用该方法的最快方法是: 但是,请注意,它将值转换为Python对象,因此性能可能取决于数据类型和使用的Python版本
>>> type(arr.item(0))
int
其次是arr.flat[0]
。它的优点是返回numpy类型
>>> arr.flat[0]
1
>>> type(arr.flat[0])
numpy.int64
np.flatte
在性能和内存使用方面不是很好,因为它返回数组的副本而不是视图ravel
如果数组的内存布局不是C-连续的,它也会创建副本。最好使用arr.flat[0]
或arr.take(0)
,这取决于您想要的是NumPy标量还是普通Python标量。这些选项从不需要副本。@user2357112嗯,这是非常有用的信息。谢谢