【问题标题】:shape vs len for numpy arraynumpy 数组的 shape vs len
【发布时间】:2016-09-21 18:24:40
【问题描述】:

比较shapelen 时是否存在差异(例如性能)?考虑以下示例:

In [1]: import numpy as np

In [2]: a = np.array([1,2,3,4])

In [3]: a.shape
Out[3]: (4,)

In [4]: len(a)
Out[4]: 4

快速运行时比较表明没有区别:

In [17]: a = np.random.randint(0,10000, size=1000000)

In [18]: %time a.shape
CPU times: user 6 µs, sys: 2 µs, total: 8 µs
Wall time: 13.1 µs
Out[18]: (1000000,)

In [19]: %time len(a)
CPU times: user 5 µs, sys: 1 µs, total: 6 µs
Wall time: 9.06 µs
Out[19]: 1000000

那么,有什么区别,哪一个更 Pythonic? (我猜使用shape)。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    我不会担心这里的性能 - 任何差异都应该是非常微小的。

    我会说更 Python 的替代方案可能更符合您的需求:

    a.shape 可能包含比len(a) 更多的信息,因为它包含沿所有轴的大小,而len 仅返回沿第一个轴的大小:

    >>> a = np.array([[1,2,3,4], [1,2,3,4]])
    >>> len(a)
    2
    >>> a.shape
    (2L, 4L)
    

    如果您实际上只使用一维数组,我个人更倾向于使用len(a),以防您明确需要数组的大小。

    【讨论】:

    • 为了完整起见:a.shape[0] == len(a).
    • 为了完整起见,a.size 也是一个选项。虽然我个人更喜欢len(a),以防万一a不是一个numpy数组,当你不小心时,有时会发生这种情况。
    【解决方案2】:

    从源码看,shape 基本使用len()https://github.com/pandas-dev/pandas/blob/master/pandas/core/frame.py

    @property
    def shape(self) -> Tuple[int, int]:
        return len(self.index), len(self.columns)
    
    def __len__(self) -> int:
        return len(self.index)
    

    调用 shape 将尝试运行两个暗淡计算。所以也许df.shape[0] + df.shape[1]len(df.index) + len(df.columns) 慢。尽管如此,就性能而言,除了巨大的 2D 数据帧之外,差异应该可以忽略不计。

    因此,与之前的答案一致,如果您需要两个维度,df.shape 很好,对于单个维度,len() 在概念上似乎更合适。

    查看property vs method 的答案,都指向代码的可用性和可读性。同样,在您的情况下,我会说如果您想要有关整个数据帧的信息只是为了检查或例如将形状元组传递给函数,请使用shape。对于单个列,包括 index(即 df 的行),请使用 len()

    【讨论】:

      【解决方案3】:

      对于一维情况,len 和 shape 都会产生相同的结果。 对于其他情况,我将提供更多信息。这取决于程序到程序,其中将为您提供更好的性能。我建议你不要太担心性能。

      【讨论】:

      • 试试:len(np.array([0,2])) , type(np.array([0,2]).shape)len 返回一个整数,shape 返回一个整数元组。如果实际在代码中使用结果而不是肉眼检查,这一点很重要
      【解决方案4】:
      import numpy as np
      
      x = np.linspace(1, 10, 10).reshape((5, 2))
      print(x)
      print(x.size)
      print(len(x))
      

      给出以下输出:

      [[ 1.  2.]
       [ 3.  4.]
       [ 5.  6.]
       [ 7.  8.]
       [ 9. 10.]]
      10
      5
      

      【讨论】:

        猜你喜欢
        • 2017-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-28
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 2021-09-14
        相关资源
        最近更新 更多