Python 具有NAN的numpy阵列上的数学运算

Python 具有NAN的numpy阵列上的数学运算,python,numpy,Python,Numpy,有没有办法忽略numpy数组中的NAN? 我的问题是,我有一个numpy数组,其中包含很少的NAN,我正在对数组进行数学运算,例如 dev0 = numpy.sqrt((x0 - x1) ** 2 + (y0 - y1) ** 2) 当然,因为NaN,有一个例外类型错误:ufunc“subtract”不包含具有签名匹配类型dtype('S14')dtype('S14')dtype('S14')的循环。 那么,是否有任何方法可以使上述操作在NAN中成功,但阵列dev0的大小与x0相同 在以下几条

有没有办法忽略numpy数组中的NAN? 我的问题是,我有一个numpy数组,其中包含很少的NAN,我正在对数组进行数学运算,例如

dev0 = numpy.sqrt((x0 - x1) ** 2 + (y0 - y1) ** 2)
当然,因为NaN,有一个例外<代码>类型错误:ufunc“subtract”不包含具有签名匹配类型dtype('S14')dtype('S14')dtype('S14')的循环。

那么,是否有任何方法可以使上述操作在NAN中成功,但阵列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)

将此作为一个答案,这可能会帮助其他人

@abarnert为您提供了重要提示,我们为此感到荣幸

从问题中的注释中得到提示后,我挖掘了更多信息,发现numpy.array确实返回了一个元素字符串,如果它在yaml文件返回的原始数组中发现任何非数字(如NaN或apple或任何东西)。yaml文件只有浮点数,我不明白为什么在浮点数上有字符串操作。我发现答案是numpy.array会自动将浮点数组转换为字符串数组,以防它在数组中找到任何不是数字的元素。但是如果遵循一个约定并在NAML文件中写NANN而不是NANN,NUMPY.ARD会把它看作一个浮点。 通过后处理将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. }

你认为NaN元素会发生什么?一个缺口。无论哪里有Nan,dev0也有Nan。我不确定,尽管有Nan,你的形状应该被保留。这与Nan无关,你为什么要用字符串执行算术?你有没有可能把输出写成字符串,然后用
eval
读回,最后得到类似
np.array的结果([1,3,'nan',5])
而不是
np.array([1,3,np.nan,5])
?如果是这样,也不要这样做。