python - Numpy浮动促销不一致
问题描述
我的理解是,在 中x = f() * g()
,首先f()
执行,然后g()
,然后将结果相乘,然后才分配给x
. 然而下面似乎与此相矛盾:
import numpy as np
print(np.sqrt(2).dtype)
print((np.array([1.], dtype='float32') * np.array([.5], dtype='float64')).dtype)
print((np.array([1.], dtype='float32') * np.sqrt(2)).dtype)
>>> float64
>>> float64
>>> float32
在我之前的所有经验中,Numpy 都晋升到了更大的级别dtype
,但不是在这里。如果我们分配单个数组并随后相乘,则行为相同。我想 Numpy 使用了一些隐藏属性,dtype
而不是推翻 Python 执行。
效果如何?
解决方案
在第 2 行:
print((np.array([1.], dtype='float32') * np.array([.5], dtype='float64')).dtype)
您正在将两个数组相乘,因此它会提升 dtype(如您所料)。但是,在第三行:
print((np.array([1.], dtype='float32') * np.sqrt(2)).dtype)
您将一个标量乘以一个数组,它会保留数组 dtype。请注意,如果您将标量替换为这样的数组:
print((np.array([1.], dtype='float32') * np.sqrt([2])).dtype)
你会再次得到float64
你所期望的。
推荐阅读
- javascript - chrome自动填充期间输入元素未触发“输入”事件
- sqlalchemy - SQLAlchemy:与对象的孩子连接表
- excel - 从 Excel VBA 生成包含表单域的 PDF
- c++ - 增加和减少优先级队列的模板函数
- android - 在 Gradle 侧选项卡中看不到我的新模块
- python - 如果我使用 discord.utils.get() 或 discord.utils.find(),为什么没有填充我的成员变量?
- aws-api-gateway - 使用 Cloudformation 的 API 网关访问日志
- python - 是否存在“非影响”交互?
- r - 绘制从 SVAR 中选择的脉冲响应函数
- java - Spring Simple Mongo Repository 保存行为