形状与len为numpy数组

Dro*_*ror 10 python numpy

是否有差异(在例如性能)进行比较时,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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

那么,有什么不同,哪一个更pythonic?(我想用shape).

seb*_*ian 10

我不担心这里的表现 - 任何差异都应该是非常微小的.

我会说更多的pythonic替代品可能更符合您的需求:

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

>>> a = np.array([[1,2,3,4], [1,2,3,4]])
>>> len(a)
2
>>> a.shape
(2L, 4L)
Run Code Online (Sandbox Code Playgroud)

如果你真的碰巧只使用一维数组,那么我个人赞成使用len(a),以防你明确需要数组的大小.

  • 只是为了完整性:`a.shape [0] == len(a)`. (13认同)

小智 5

从源代码看,形状基本上使用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)
Run Code Online (Sandbox Code Playgroud)
def __len__(self) -> int:
    return len(self.index)
Run Code Online (Sandbox Code Playgroud)

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

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

查看属性与方法的答案,这一切都指向代码的可用性和可读性。所以,再一次,在你的情况下,我会说如果你想要关于整个数据帧的信息只是为了检查或例如将形状元组传递给函数,请使用shape. 对于单列,包括索引(即 df 的行),使用len().