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

2024-04-25 14:35:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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值,它会影响其他数据集的所有相同索引。你知道吗

我找不到一个简单的方法。有什么建议吗?你知道吗


Tags: 数据np数组nan指数outwherearray
3条回答
>>> 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.])
#....

有一个非常简单的方法。不要使用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] 

现在,每当你发现自己在使用形状相同的数组,比如x1x2x3,等等,你可能只需要一个额外维度的数组。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]).reshape(-1, 1)创建一个列向量,强制通过广播将1D掩码应用于每一行。你知道吗

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

相关问题 更多 >