【问题标题】:Find first element of numpy ndarray of unknown shape [duplicate]查找形状未知的numpy ndarray的第一个元素[重复]
【发布时间】:2016-05-03 12:45:10
【问题描述】:

如果您不知道数组的形状,有没有一种简单的方法可以取出 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 要求感兴趣。

【问题讨论】:

    标签: python arrays python-2.7 numpy


    【解决方案1】:

    您可以使用 .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
    

    【讨论】:

    • 如果数组的内存布局不是 C 连续的,ravel 也会创建一个副本。最好使用arr.flat[0]arr.take(0),这取决于您需要 NumPy 标量还是普通的 Python 标量。这些选项从不需要副本。
    • @user2357112 嗯,这是非常有用的信息。谢谢!
    【解决方案2】:

    到目前为止我发现的最快的方法是使用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
    

    【讨论】:

      【解决方案3】:

      以上答案将起作用。但是,您也可以使用:

      arr.reshape(-1)[0]
      

      【讨论】:

        【解决方案4】:

        我建议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 在性能和内存使用方面并不是很好,因为它返回的是数组的副本而不是视图
        猜你喜欢
        • 1970-01-01
        • 2020-12-04
        • 2020-02-05
        • 2017-01-07
        • 2021-08-23
        • 2019-01-25
        • 2018-07-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多