我尝试将列表理解为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发行版。
答案 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
正在进行的转换。