当前位置: 首页 > 面试题库 >

numpy.sum()在大型数组上给出奇怪的结果

邓欣德
2023-03-14
问题内容

我似乎.sum()numpy数组上使用时发现了一个陷阱,但是我找不到解释。本质上,如果我尝试对一个大数组求和,那么我会开始得到荒谬的答案,但这是
无声的, 而且我无法充分理解输出结果,而不是Google的原因。

例如,这完全按预期工作:

a = sum(xrange(2000)) 
print('a is {}'.format(a))

b = np.arange(2000).sum()
print('b is {}'.format(b))

为两者提供相同的输出:

a is 1999000
b is 1999000

但是,这不起作用:

c = sum(xrange(200000)) 
print('c is {}'.format(c))

d = np.arange(200000).sum()
print('d is {}'.format(d))

提供以下输出:

c is 19999900000
d is -1474936480

在更大的阵列上,有可能获得正面的结果。这是更隐蔽的,因为我可能根本不知道发生了什么不寻常的事情。例如:

e = sum(xrange(100000000))
print('e is {}'.format(e))

f = np.arange(100000000).sum()
print('f is {}'.format(f))

给出以下内容:

e is 4999999950000000
f is 887459712

猜想 这与数据类型有关,甚至使用python确实float可以解决问题:

e = sum(xrange(100000000))
print('e is {}'.format(e))

f = np.arange(100000000, dtype=float).sum()
print('f is {}'.format(f))

给予:

e is 4999999950000000
f is 4.99999995e+15

我没有Comp的背景。科学 发现自己被卡住了(也许这是骗子)。我尝试过的事情:

  1. numpy数组具有固定的大小。不; 这似乎表明我应该打MemoryError第一个。
  2. 我可能以某种方式进行了32位安装(可能不相关);是的,我遵循了这一点,并确认我具有64位。
  3. 怪异sum行为的其他示例;没了( )我发现这个,但我看不出它如何应用。

有人可以简要解释一下我所缺少的内容,然后告诉我我需要阅读哪些内容吗?另外,除了记得定义dtype每次,还可以阻止这种情况发生或发出警告吗?

可能相关:

Windows 7的

numpy 1.11.3

在Python 2.7.9上用完了有思想的机盖


问题答案:

显然这是numpy的整数类型,溢出32位。通常,您可以使用以下命令将numpy配置为在这种情况下失败np.seterr

>>> import numpy as np
>>> np.seterr(over='raise')
{'divide': 'warn', 'invalid': 'warn', 'over': 'warn', 'under': 'ignore'}
>>> np.int8(127) + np.int8(2)
FloatingPointError: overflow encountered in byte_scalars

但是,sum已明确记录了行为“ 溢出时不会引发错误 ”,因此您在这里可能不走运。为了方便起见,使用numpy通常是性能的折衷!

但是,您可以手动为累加器指定dtype,如下所示:

>>> a = np.ones(129)
>>> a.sum(dtype=np.int8)  # will overflow
-127
>>> a.sum(dtype=np.int64)  # no overflow
129

观看票号593,因为这是一个未解决的问题,它可能由numpy开发人员修复。



 类似资料:
  • 问题内容: 因此,当我在Java中使用Doubles进行加法或减法时,它会给我带来奇怪的结果。这里有一些: 如果我加上,它给了我。没错 如果我添加,它会给我(重复s 的数量可能会关闭)。错了 如果我减去,它就会给我(再次,重复的s可能会关闭)。错了 起初我以为这只是将双精度数与十进制值相加的问题,但我错了。以下工作正常: 现在,添加的第一个数字是保存为变量的双精度数,尽管第二个变量从捕获文本。例如

  • 问题内容: 我了解由于数值误差(例如,以不同顺序对浮点求和),在数学上等效的算术运算如何导致不同的结果。 但是,令我惊讶的是,将零加到可以更改结果。我认为无论哪种情况,这对于浮动广告始终有效。 这是一个例子。我希望所有行都完全为零。有人可以解释为什么会这样吗? 和的较小值似乎不会发生Z。 我也确定。 这是另一个示例,它还演示了python的内置行为符合预期: 我正在使用numpy V1.9.2。

  • 问题内容: 试图在LINQ查询(使用Entityframework)中实现条件创建了奇怪的查询。在某些情况下,即使阈值设置为180秒,这些查询也会超时: 使用一些不太优雅的if语句,我没有任何问题,查询在几秒钟内返回: 条件语句都是从查询字符串传递的,这就是为什么它们有时可能带有值而有时却没有值的原因。 使用三元运算符时会出现相同的问题 关于这些内联条件为何表现如此差的情况,是否有合理的解释? 问

  • 问题内容: 有没有人看到像这样的方法签名后放置的数组? 版画 过去,“ C”兼容性是一种奇怪的表示法,但我也无法想象有人用C编写这种代码。 有谁知道为什么甚至允许这样做? 如果有问题,我正在使用Java 7 update 10。 这与Java 6中的功能相同。http://ideone.com/91rZV1 顺便说一句,这不会编译,我也不希望它编译 问题答案: 有谁知道为什么甚至允许这样做? 在这

  • 我正在使用Weka Gui-Explorer,我想根据类{男性,女性}对我的数据进行分类。我使用MultiBoostAB分类器,以REPTree分类器为基础。我正在尝试使用训练集(557个实例)评估我的分类器的准确性 然后是一个具有大约300个属性的测试集(200个实例)。准确率83,5% - 167从200个实例中正确分类,kappa统计量为0,67。我保存了这个模型,并用它来预测 其他未知数据

  • 当试图从Hitbox API获取数据时,我得到了一个奇怪的结果。对于一个API的命令,这种情况每次都会发生,而对于另一个API的命令,这种情况只是有时发生。结果差不多是这样(这是我得到的最后一个结果): \U001F\B\0\0\0\0\0\U0003W8SμMU~S N T&N G6C$Z%9IGF[(\U0005\U000F(:6\U000F\B P C\U0015\N\U007F V\U00