这段代码给出了一个可怕的结果(这是在Python 3.5,NumPy 1.10。):
import numpy as np
a = np.array([0,0,1])
a[1] = 2.5
print(a) -----> [0 2 1]
(当你试图将一个浮点放在一个整数numpy数组中时,它会向下舍入而没有任何警告!)
我的问题是:是否有任何numpy设置和/或编程技术可靠地避免这种问题?当然我知道每次我声明一个数组时我都可以使用a = np.array(..., dtype=float)
或a = np.array([0., 0., 1.])
或其他任何东西,但我正在寻找比这更可靠的东西 - 毕竟我可以忘记。例如,是否有一个numpy的开关,普遍打开粗略类型强制的警告?或类似的东西?
答案 0 :(得分:1)
请注意,数组元素的类型是数组本身的属性,因此如果您尝试将另一种类型的元素分配给数组,它将被静默转换(如果可能):
>>> T = a.copy()
>>> T[2] = -1.5
>>> T
array([ 0, 0, -1])
>>> T[2] = -0.5j
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't convert complex to int; use int(abs(z))
请注意,发生的转化是默认转换;在float到int转换的情况下,它是截断。如果你想要一些不同的东西,比如说发言,你必须自己安排(例如用np.floor())。在将复数值转换为整数的情况下,没有合理的默认方式来执行此操作,因此numpy会引发异常并使数组保持不变。 这意味着没办法。
有关详细信息,请参阅此处: https://scipy.github.io/old-wiki/pages/Cookbook/Indexing.html
答案 1 :(得分:1)
部分回答here。使用设置或标志在numpy中似乎不可能这样做。
如果你不需要更高级的numpy功能,那么python数组类型是一种更好的替代方法(参见this answer)。
我链接的答案建议继承np.ndarray。至少可以说,这将是一项非常重要的任务。
我能看到的最简单的方法是:
a = np.array([0,0,1])
a[1] = 2.5
assert a[1] == 2.5