在Python中列出对2的幂的列表理解失败了numpy数组

时间:2018-02-17 15:55:32

标签: python numpy list-comprehension

我尝试将列表理解为2的幂(x 2**x)得到一个数字列表,我注意到:

[2**x for x in [2, 100]] # works fine

然而,

[2**x for x in np.array([2, 100])] # doesn't work.
[x for x in 2**np.array([2, 100])] # doesn't work.

但不是错误,输出是:Out[98]: [4, 0]。然而:

[2**x for x in np.array([2, 10])] # works fine
[x for x in 2**np.array([2, 10])] # works fine

完全相同,只是一个较小的数字。

这可能是什么原因?我在Spyder中使用Python 3.6和Anaconda发行版。

2 个答案:

答案 0 :(得分:2)

2 ^ 100对于int来说太大了,您应该将类​​型设置为object

[2**x for x in np.array([2, 100], dtype='object')]

将给出

[4, 1267650600228229401496703205376]

答案 1 :(得分:2)

np.array将列表内容转换为numpy类型:

>>> import numpy as np
>>> x = np.array([2, 100])
>>> type(x[1])
<class 'numpy.int64'>

这是numpy的固定长度64位整数。

然而在python中,我们得到:

>>> y = [2, 100]
>>> type(y[1])
<class 'int'>

这是python的任意大小的整数(BigInteger在其他语言中)

无论出于何种原因(这可能是numpy,但也许不是我期望的行为!),numpy的int64溢出为零:

>>> 2 ** np.int64(100)
0

(或更直接)

>>> 2 ** x[1]
0

在这种情况下,列表理解是一个红色的鲱鱼,差异的实际原因np.array正在进行的转换。