python - numpy中dtype转换的原理是什么?
问题描述
最近我找到了一个phononmen,让有一个名为的int数组data
,其值为
[[1,2,3],
[4,5,6]]
我想减去一个浮点数,我写如下
data[0] = data[0] - 0.5
在我看来,data
应该是
[[0.5, 1.5, 2.5],
[ 4, 5, 6]]
其实data
没变。我使用另一种方式 => data[0] -= 0.5
,并且有一个 dtype 错误。
所以,我使用astype
它并让它工作,但让我困惑的是为什么data[0] = data[0] - 0.5
不会导致错误?data[0] = data[0] - 0.5
和 和有什么不一样data[0] -= 0.5
?我发现[1]说它是等价的。
解决方案
实际上,data
已更改,您最终只是用相同的值替换了一些值。该表达式data[0] - 0.5
创建一个允许具有新 dtype 的新数组,在本例中为 float dtype array [0.5, 1.5, 2.5]
。但是,data
它是一个整数 dtype 数组,即使您尝试将 float 数组分配给[0.5, 1.5, 2.5]
它的一部分,它也无法更改其 dtype data[0]
。它最终四舍五入到[1, 2, 3]
,这恰好是相同的值。试试看data[0] = data[0] - 1.5
,你会看到不同。
其次,告诉你的源码在Pythonx = x + y
中相当于是错误的。做加法然后分配。由完全独立的方法实现。但在大多数情况下,并且会做非常相似的事情。x += y
x = x + y
x.__add__(y)
=
x += y
x.__iadd__(y)
__add__
__iadd__
您的案例因索引而变得更加复杂,data[0] -= 0.5
因此data.__setitem__(0, temp)
将在之后调用temp = data[0].__isub__(0.5)
。
推荐阅读
- docusignapi - 未在作废/丢弃的草稿信封上调用 Webhook
- ios - 如果条件为真,如何转移到特定的故事板?
- python - 如何将十六进制格式的私钥转换为 pem 和/或 der 格式的私钥?
- angular - 从所有组件打开 ng-bootstrap modal
- postgresql - 无法在 postgresql 中添加检查约束
- python - 在 python 中从 SwaggerAPI 自动生成服务框架
- javascript - 有没有办法将多个div组合成一个
- c# - 如何使用最小起订量 ApplicationUser、ApplicationContextdb、IEmailSender 和 IConfirguration 编写测试用例
- ruby - Ruby:为什么第二段代码与第一段代码相似 - 给出“未定义方法”错误?
- r - 使用 doi 从论文中检索参考文献