Python 具有NAN的numpy阵列上的数学运算
有没有办法忽略numpy数组中的NAN? 我的问题是,我有一个numpy数组,其中包含很少的NAN,我正在对数组进行数学运算,例如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相同 在以下几条
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])
?如果是这样,也不要这样做。