Python 如何组合具有Nan值的数组列?

Python 如何组合具有Nan值的数组列?,python,python-3.x,numpy,Python,Python 3.x,Numpy,我是python的初学者,在组合数据方面遇到了一些问题 我要做的是处理数据,完全丢弃具有Nan值的列 但在我的大多数数据中,Nan值的指数是不同的 比如说, data1 = np.array([1, 2, np.nan, 4, 5]) data2 = np.array([1, np.nan, 3, 4, 6]) data3 = np.array([np.nan, 2, 3, 4, 7]) ind_1 = np.where(~np.isnan(data1)) ind_2 = np.where(~

我是python的初学者,在组合数据方面遇到了一些问题

我要做的是处理数据,完全丢弃具有Nan值的列

但在我的大多数数据中,Nan值的指数是不同的

比如说,

data1 = np.array([1, 2, np.nan, 4, 5])
data2 = np.array([1, np.nan, 3, 4, 6])
data3 = np.array([np.nan, 2, 3, 4, 7])

ind_1 = np.where(~np.isnan(data1))
ind_2 = np.where(~np.isnan(data2))
ind_3 = np.where(~np.isnan(data3))

-----

data1_out = data1[ind_1[0]]  # array([ 1., 2., 4., 5.])
data2_out = data2[ind_2[0]]  # array([ 1., 3., 4., 6.])
data3_out = data3[ind_3[0]]  # array([ 2., 3., 4., 7.])
但我需要的是一个

data1_out = array([ 4., 5.])
data2_out = array([ 4., 6.])
data3_out = array([ 4., 7.])
所以我认为组合数组

ind_c = intersection(ind_1, ind_2, ind_3)
data1_out = data1[ind_c[0]]
会解决问题的

这是与其他数据集共享的输出,因此如果一个数据集的索引具有Nan值,则会影响其他数据集的所有相同索引


我找不到一个简单的方法来做这件事。有什么建议吗?

将所有阵列组合成一个二维阵列:

>>> truth = ~np.isnan(data1) & ~np.isnan(data2) & ~np.isnan(data3)
>>> data1[truth]
[4. 5.]
>>> data2[truth]
[4. 5.]
>>> data3[truth]
[4. 5.]
z = np.stack([data1, data2, data3])
查找非nan列:

columns = ~np.isnan(z).any(axis=0)
选择数据:

data1, data2, data3 = z[:, columns]
#array([4., 5.])
#....

将所有阵列合并为二维阵列:

z = np.stack([data1, data2, data3])
查找非nan列:

columns = ~np.isnan(z).any(axis=0)
选择数据:

data1, data2, data3 = z[:, columns]
#array([4., 5.])
#....

有一个非常简单的方法可以做到这一点。不要使用
where
来获取数字索引,而是使用
isnan
生成的布尔掩码。遮罩更容易组合,而且通常也更容易以其他方式使用,更不用说它为每个阵列节省了一步

mask_1 = ~np.isnan(data1)
mask_2 = ~np.isnan(data2)
mask_3 = ~np.isnan(data3)
现在,您可以使用简单的布尔运算将掩码组合为一个,并将结果应用于每个数组:

mask = mask_1 & mask_2 & mask_3
data1_out = data1[mask] 
data2_out = data2[mask] 
data3_out = data3[mask] 
现在,每当您发现自己在使用类似于
x1
x2
x3
等形状相同的数组时,您可能只需要一个具有额外维度的数组。99%的时候,它会让你的生活变得更轻松:

data = np.array([[1, 2, np.nan, 4, 5],
                 [1, np.nan, 3, 4, 6],
                 [np.nan, 2, 3, 4, 7]])
mask = ~np.isnan(data).any(axis=0)
data_out = data[np.arange(data.shape[0]).reshape(-1, 1), mask]
any
|
应用于所有元素
np.arange(data.shape[0])。重塑(-1,1)
创建一个列向量,强制通过广播将1D掩码应用于每一行


当然,这种方法的前提是每行中有相等数量的NAN。如果不是这样,您就必须使用单独的数组。

有一种非常简单的方法可以做到这一点。不要使用
where
来获取数字索引,而是使用
isnan
生成的布尔掩码。遮罩更容易组合,而且通常也更容易以其他方式使用,更不用说它为每个阵列节省了一步

mask_1 = ~np.isnan(data1)
mask_2 = ~np.isnan(data2)
mask_3 = ~np.isnan(data3)
现在,您可以使用简单的布尔运算将掩码组合为一个,并将结果应用于每个数组:

mask = mask_1 & mask_2 & mask_3
data1_out = data1[mask] 
data2_out = data2[mask] 
data3_out = data3[mask] 
现在,每当您发现自己在使用类似于
x1
x2
x3
等形状相同的数组时,您可能只需要一个具有额外维度的数组。99%的时候,它会让你的生活变得更轻松:

data = np.array([[1, 2, np.nan, 4, 5],
                 [1, np.nan, 3, 4, 6],
                 [np.nan, 2, 3, 4, 7]])
mask = ~np.isnan(data).any(axis=0)
data_out = data[np.arange(data.shape[0]).reshape(-1, 1), mask]
any
|
应用于所有元素
np.arange(data.shape[0])。重塑(-1,1)
创建一个列向量,强制通过广播将1D掩码应用于每一行


当然,这种方法的前提是每行中有相等数量的NAN。如果不是这样的话,你就必须使用单独的阵列。

哇,太棒了,真的很有帮助!!谢谢你,先生!:)哇,太棒了,真的很有帮助!!谢谢你,先生!:)如果一个答案适合你,就选择一个。如果一个答案适合你,就选择一个。虽然这不是最简单的方法,但它启发了我!谢谢你,先生!!虽然这不是最简单的方法,但它启发了我!谢谢你,先生!!好了,现在我认得了。非常感谢。好了,现在我认得了。非常感谢。