【发布时间】:2020-02-21 03:14:38
【问题描述】:
当计算的输入是具有 32 位整数数据类型的 numpy 数组,但输出包含需要 64 位表示的较大数字时,我遇到了不正确的 numpy 计算问题。
这是一个最小的工作示例:
arr = np.ones(5, dtype=int) * (2**24 + 300) # arr.dtype defaults to 'int32'
# Following comment from @hpaulj I changed the first line, which was originally:
# arr = np.zeros(5, dtype=int)
# arr[:] = 2**24 + 300
single_value_calc = 2**8 * (2**24 + 300)
numpy_calc = 2**8 * arr
print(single_value_calc)
print(numpy_calc[0])
# RESULTS
4295044096
76800
想要的输出是 numpy 数组包含正确的值 4295044096,这需要 64 位来表示它。即,我希望 numpy 数组在输出需要时自动从 int32 向上转换为 int64,而不是保持 32 位输出并在超过 2^32 的值后返回 0。
当然,我可以通过强制 int64 表示来手动解决问题:
numpy_calc2 = 2**8 * arr.astype('int64')
但这对于一般代码来说是不可取的,因为在某些情况下输出只需要 64 位表示(即保存大数字)而不是全部。在我的用例中,性能至关重要,因此每次都强制向上转换成本很高。
这是 numpy 数组的预期行为吗?如果是这样,请问有没有干净、高效的解决方案?
【问题讨论】:
-
强制转换的是
arr[:]=赋值,你不能那样改变数组的dtype。看看如果将浮点数分配给 tgat 数组会发生什么。 -
感谢您的评论,尽管该行不是应该进行转换的地方。这是我想要 64 位输出的“numpy_calc = ...”行。例如,我可以删除 [:] 操作,问题仍然存在(参见修改后的帖子)。
标签: python arrays numpy integer numpy-ndarray