【问题标题】:avoid numpy type coercion gotcha? [duplicate]避免 numpy 类型的强制陷阱? [复制]
【发布时间】:2016-01-07 21:05:12
【问题描述】:

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

【问题讨论】:

    标签: python numpy type-conversion


    【解决方案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

    【讨论】:

      【解决方案2】:

      部分回答here。用设置或标志在 numpy 中执行此操作似乎是不可能的。

      如果您不需要更高级的 numpy 功能,python 数组类型是一种表现更好的替代方案(请参阅this answer)。

      我链接到的答案建议子类化 np.ndarray。至少可以说,这将是一项不平凡的任务。

      我能看到的最简单的方法是:

      a = np.array([0,0,1])
      a[1] = 2.5
      assert a[1] == 2.5
      

      【讨论】:

        猜你喜欢
        • 2010-11-16
        • 1970-01-01
        • 2015-04-08
        • 1970-01-01
        • 2020-12-29
        • 1970-01-01
        • 1970-01-01
        • 2012-01-10
        • 2013-02-26
        相关资源
        最近更新 更多