numpy 从列表中删除NaN值(Python 3.10)

gcmastyq  于 2023-06-29  发布在  Python
关注(0)|答案(2)|浏览(121)

我试图从X-Y数据点的Python 3.10 NumPy数组中删除所有NaN值条目,然后通过polyfit NumPy函数创建多项式拟合数据。实际的NaN值位于Y轴上,但我想删除NaN的每个Y示例的X和Y值。
following attempt

import numpy as np

def main():
    dataX = [1, 2, 3, 4, 5]
    dataY = [1, np.nan, 5, np.nan, 1]

    finiteIdx = np.isfinite(dataX) & np.isfinite(dataY)
    poly = np.polyfit(dataX[finiteIdx], dataY[finiteIdx], 2)

if (__name__ == "__main__"):
    main()

结果:

poly = np.polyfit(dataX[finiteIdx], dataY[finiteIdx], 2)
TypeError: only integer scalar arrays can be converted to a scalar index

following attempt

import numpy as np

def main():
    dataX = [1, 2, 3, 4, 5]
    dataY = [1, np.nan, 5, np.nan, 1]

    poly = np.polyfit(dataX[~np.isnan(dataY)], dataY[~np.isnan(dataY)], 2)

if (__name__ == "__main__"):
    main()

结果:

poly = np.polyfit(dataX[~np.isnan(dataY)], dataY[~np.isnan(dataY)], 2)
TypeError: only integer scalar arrays can be converted to a scalar index

following attempt

import numpy as np

def main():
    dataX = [1, 2, 3, 4, 5]
    dataY = [1, np.nan, 5, np.nan, 1]

    poly = np.polyfit(dataX[dataY != np.nan], dataY[dataY != np.nan], 2)

if (__name__ == "__main__"):
    main()

结果:

raise TypeError("expected 1D vector for x")
TypeError: expected 1D vector for x

从NumPy数组中删除所有NaN值的正确方法是什么?
感谢您阅读我的文章,任何指导都很感激。

mlnl4t2r

mlnl4t2r1#

关于你的第一次尝试,你只需要将dataXdataY转换为numpy ndarray,然后代码就可以工作了。

import numpy as np

dataX = np.array([1, 2, 3, 4, 5])
dataY = np.array([1, np.nan, 5, np.nan, 1])

finiteIdx = np.isfinite(dataX) & np.isfinite(dataY)
poly = np.polyfit(dataX[finiteIdx], dataY[finiteIdx], 2)

错误消息具有误导性,您可以在此question中获得更多信息。

ehxuflar

ehxuflar2#

您可以将dataX,dataY组合成一个2D数组,并删除具有NaN的列或行(然后根据需要使用数组元素)。但是如果你想让他们分开,那么这可能会有所帮助:

import numpy as np

dataX = [1, 2, 3, 4, 5]
dataY = [1, np.nan, 5, np.nan, 1]

def clean2 (arr1, arr2):
    res1 = np.array([x for i, x in enumerate(arr1) if not np.isnan(dataY[i]) ])
    res2 = np.array([x for i, x in enumerate(arr2) if not np.isnan(dataY[i]) ])
    return res1, res2

dataX, dataY =  clean2(dataX, dataY)

print(dataX)
print(dataY)

给予

[1 3 5]
[1 5 1]

相关问题