Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找形状未知的numpy数组的第一个元素_Python_Arrays_Python 2.7_Numpy - Fatal编程技术网

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嗯,这是非常有用的信息。谢谢