【问题标题】:python numpy.single gives different result when using out parameterpython numpy.single 在使用 out 参数时给出不同的结果
【发布时间】:2021-01-25 09:42:45
【问题描述】:

我正在尝试从双精度数组转换为单精度。为了优化空间,我尝试使用 out 参数,以便 numpy 不会分配额外的空间。然而,两个版本的调用结果似乎不同

import numpy as np

doubleArr = np.zeros((10000,10000), dtype=np.double)
doubleArr[0,0] = 1e-30
singleArr = np.single(doubleArr)
print ("%.40f"%singleArr[0,0]) 
singleArr = np.zeros((10000,10000), dtype=np.single)
np.single(doubleArr, out=singleArr)
print ("%.40f"%singleArr[0,0])  

结果是

0.0000000000000000000000000000010000000032
0.0000000000000000000000000000000000000000

“out”参数的用法不正确吗?

【问题讨论】:

  • 在我的numpy 版本中,np.single (np.float32) 没有out 参数。
  • @hpaulj 是正确的——np.float32 没有使用out 参数。在旧版本的 numpy 中,np.float32(又名np.single)的未知关键字参数被忽略。比如1.8.0版本,我可以写np.float32(123, foobar="plate of shrimp"),不会产生错误。我不知道这是什么时候修复的。您使用的是哪个版本的 numpy?您可以通过import numpy as np; print(np.__version__) 查询
  • 我正在使用 '1.17.4' 。所以本质上,outparameter 被忽略了?
  • 有没有办法在不创建额外分配的情况下实现演员表?
  • 是的,out 被忽略。如果您已经创建了数组,您可以简单地分配值:singleArr[...] = doubleArr

标签: python numpy casting floating-point precision


【解决方案1】:

这个谜团解开了。调用 c 例程时的 Numpy.ctypes 会为 c-python 互操作创建一堆内存。此内存不会立即被收集,这会导致总内存使用量激增。解决方案是在内存压力下使用 gc.collect。

【讨论】:

    猜你喜欢
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2021-12-26
    • 2012-02-07
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多