【问题标题】:mathematical operations on a numpy array with NaNs使用 NaN 对 numpy 数组进行数学运算
【发布时间】:2018-04-23 20:55:24
【问题描述】:

有什么方法可以忽略 numpy 数组中的 NaN? 我的问题是我有一个带有几个 NaN 的 numpy 数组,并且我正在对数组进行数学运算,例如

dev0 = numpy.sqrt((x0 - x1) ** 2 + (y0 - y1) ** 2)

当然,因为 NaN,所以有一个例外。 TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('S14') dtype('S14') dtype('S14')

那么,有没有什么办法,上面的操作成功了NaN,但是数组dev0的大小和x0一样。

编辑,在下面几个cmets之后:

这是我正在读取的 YAML 文件。

- { x: 5.4725573730468750e+02, y: -3.4774234008789062e+02 }
- { x: 3.8519703125000000e+04, y: 6.4700851440429688e+01 }
- { x: 5.8734118652343750e+02, y: -3.4341723632812500e+02 }
- { x: 8.8773913574218750e+02, y: -3.4931005859375000e+02 }
- { x: 4.0723339843750000e+02, y: -3.4757397460937500e+02 }
- { x: NaN, y: -65535. }

代码-

    collision_points = yaml_load["points"]
    # the entries in collision_points are not read as strings
    collision = list()
    for count in range(len(collision_points)):
        xy = list()
        xy.append(collision_points[count]["x"])
        xy.append(collision_points[count]["y"])
        collision.append(xy)
    data = numpy.array(collision)
    x0, y0 = data.T
    # x1, y1 comes from somewhere else. Its also a numpy array
    dev0 = numpy.sqrt((x0 - x1) ** 2 + (y0 - y1) ** 2)

【问题讨论】:

  • 您希望 NaN 元素会发生什么?
  • 一个差距。哪里有 Nan,dev0 也有一个 NaN
  • 不确定我是否遵循,尽管有 NaN,但应该保留您的形状。
  • 那与 NaN 无关,你为什么要对字符串进行算术运算?
  • 您是否可能将输出写为字符串,然后尝试使用eval 将其读回并最终得到类似np.array([1, 3, 'nan', 5]) 而不是np.array([1, 3, np.nan, 5]) 的内容?如果是这样……也不要那样做。

标签: python numpy


【解决方案1】:

将其写为答案,这可能对其他人有所帮助。

感谢 @abarnert 提供重要提示。

在从问题中的 cmets 获得提示后,我挖掘了更多信息,发现 numpy.array 确实返回了一串元素,如果它在原始数组中找到任何非数字(如 NaN 或 apple 或任何东西)由 yaml 文件返回。 yaml 文件只有浮点数,我很困惑为什么浮点数上有字符串操作。我发现了 numpy.array 自动将浮动数组转换为字符串数组的答案,以防它在数组中找到任何不是数字的元素。但是,如果遵循约定并在 YAML 文件中写入 .nan 而不是 NaN,则 numpy.array 会将其视为浮点数。

通过后处理将 NaN 更改为 .nan 后,numpy.array 保留了所有浮点数,程序按预期运行。

后处理后的yaml文件是这样的

- { x: 5.4725573730468750e+02, y: -3.4774234008789062e+02 }
- { x: 3.8519703125000000e+04, y: 6.4700851440429688e+01 }
- { x: 5.8734118652343750e+02, y: -3.4341723632812500e+02 }
- { x: 8.8773913574218750e+02, y: -3.4931005859375000e+02 }
- { x: 4.0723339843750000e+02, y: -3.4757397460937500e+02 }
- { x: .nan, y: -65535. }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-11
    • 2020-12-23
    • 2011-03-25
    • 1970-01-01
    • 2011-07-18
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多