使用列表推导式将NumPy数组展平,替代解决方案。

4

我有一个形状为 (14, 3200, 2500) 的数组 a。

我想从中提取非 nan 值到一个形状为 (-1, 14) 的数组。

这是我的当前代码:

nans = ~(np.isnan(a)).any(axis=0)
indices = np.where(nans)
vals = np.asarray([a[:, i, j] for i, j in zip(indices[0], indices[1])])

但我认为我应该将列表推导式更改为numpy内置函数,但是找不到一个能做到这一点的函数,因为这似乎并不快。有人有好的建议吗?

编辑: 我还在尝试获取这些值的索引,所以我的输出应该是形状为(-1, 14)、(-1, 2)的数组。 第二个数组是用以下代码生成的:

np.stack((indices[0],indices[1])).transpose()

因此,列表推导应保留顺序。

为什么不先将数组压平,然后提取非 NaN 值呢? - Dani Mesejo
展开数组是否保留顺序?我还试图获取这些值在数组中的坐标。我会添加一个编辑。 - MesRot
1个回答

2
使用 numpy 索引,然后跟着一个.T(转置)就可以解决这个问题:
vals = a[:, indices[0], indices[1]].T

可以检查一下,它返回与您当前的方法相同的数组:
nans = ~(np.isnan(a)).any(axis=0)
indices = np.where(nans)
vals = np.asarray([a[:, i, j] for i, j in zip(indices[0], indices[1])])

# changed the name for comparison purposes
vals2 = a[:, indices[0], indices[1]].T
print(np.isclose(vals, vals2).all())

输出

True

注意:
数组 a(用于测试)是通过以下方式生成的:
a = np.random.random((14, 3200, 2500))
a[a < 0.3] = np.nan

对于numpy数组,它的工作效果非常好。任何遇到这个问题的人请注意,这不适用于xarray.DataArray,您必须先转换为numpy。 - MesRot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接