避免numpy型强制陷阱?

时间:2016-01-07 21:05:13

标签: python numpy type-conversion

这段代码给出了一个可怕的结果(这是在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的开关,普遍打开粗略类型强制的警告?或类似的东西?

2 个答案:

答案 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