在具有NaN的numpy数组上的数学运算

时间:2018-04-23 20:55:24

标签: python numpy

有没有办法忽略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')

那么,有没有办法,上面的操作是成功的NaNs,但数组dev0的大小与x0相同。

编辑,经过以下几条评论:

这是我正在阅读的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)

1 个答案:

答案 0 :(得分:0)

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

感谢@abarnert提供重要提示。

在从问题中的评论中得到提示之后,我挖出更多并发现numpy.array确实返回了一串元素,如果它在原始数组中发现任何非数字(如NaN或苹果或任何东西)由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. }