numpy阵列的形状与长度

2024-05-23 17:21:16 发布

您现在位置:Python中文网/ 问答频道 /正文

在比较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

那么,有什么区别,哪一个更像Python?(我想是用shape)。


Tags: inlentimenpsys差异cpuout
3条回答

我不担心这里的表现——任何差异都应该非常小。

我想说,更符合你需求的可能是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),以防您显式地需要数组的大小。

从源代码来看,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将尝试运行两个dim calc。所以也许df.shape[0] + df.shape[1]len(df.index) + len(df.columns)慢。尽管如此,就性能而言,除了巨大的2D数据帧外,差异应该可以忽略不计。

因此,根据前面的答案,df.shape如果您需要两个维度,那么对于单个维度,len()在概念上似乎更合适。

看看property vs method答案,它都指向代码的可用性和可读性。因此,在您的例子中,我想说,如果您只想检查整个数据帧的信息,或者例如要将形状元组传递给函数,请使用shape。对于单个列,包括index(即df的行),使用len()

对于1D情况,len和shape都将产生相同的结果。 对于其他情况,我形状将提供更多的信息。这取决于一个程序到另一个程序,在其中可以提供更好的性能。我建议你不要太担心表演。

相关问题 更多 >