我在写一个程序,我想用一个大数(1.692287392646066e+41
)乘以一个数组中的每个数,我这样做:
x = array([ 16, 18, 19, 15, 27, 26, 13, 34, 38, 36, 43, 42, 48,
50, 55, 57, 70, 67, 65, 85, 99, 94, 90, 112, 126, 130,
142, 120])
weight = 1.692287392646066e+41
x[:] = [i*weight for i in x]
但后来我收到了错误“overflowerr:Python int太大,无法转换为C long”。奇怪的是,将for循环外的数字相乘似乎有效:
^{pr2}$我的问题是,既然我事先不知道数组有多长,有没有什么方法可以在for循环中执行此操作?(我知道它有一排。)
在
python
中而不是在numpy
中进行乘法是没有意义的。不仅numpy
更快,而且效果更好。在您要做的是创建一个
python list
,然后它试图将其复制到numpy array
元素中。在相反,只要使用
你很好。在
EOL怀疑这是否有效,所以我在电脑上做了些什么:
^{pr2}$请注意,
numpy.ndarray
实例x
一旦创建,将为存储的基础数据分配一个唯一的类型。这与Python本机列表非常不同,它类似于一个数组,其中包含对任意、duck类型的Python对象的引用。在随后对底层数组数据的就地修改(在本例中是切片分配,即实际调用
__setitem__
方法的语法糖)将尝试将值强制转换到存储类型中。在本例中,数组x
有整数,但在赋值的RHS处计算的浮点值太大,无法转换为整数,从而导致整数溢出。在如果你用一个合适的float类型来创建数组,它本来可以工作的。在pseudo Python中:
下面带有shallow copy(
s[:]
)的命令将为您创建一个s
的视图,该视图的元素类型为int
,因此在赋值之后,它尝试将[i*weight for i in s]
创建的元素分配给int
容器,但由于结果是C long,因此会引发以下错误:如果您只使用
^{pr2}$[i*weight for i in s]
,您也将看到结果:相反,您可以直接多重:
相关问题 更多 >
编程相关推荐