形状与len为numpy数组

时间:2016-05-24 13:35:44

标签: 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

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

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)。

4 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:1)

对于1D情况,len和shape将产生相同的结果。 对于其他情况,我将提供更多信息。它取决于要提供更好性能的程序。我建议您不要太担心性能。

答案 2 :(得分:0)

process.env.UV_THREADPOOL_SIZE = 2;

给出以下输出:

import numpy as np

x = np.linspace(1, 10, 10).reshape((5, 2))
print(x)
print(x.size)
print(len(x))

答案 3 :(得分:0)

从源代码看,形状基本上使用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()