【问题标题】:get non-zero and not-nan elements column wise逐列获取非零和非nan元素
【发布时间】:2020-01-04 02:22:05
【问题描述】:
import numpy as np

我有一个 numpy 数组如下:

data = np.array([[2,3,4,5,0,7,8,9,9,3,np.nan],
                 [3,3,6,5,0,7,9,9,9,3,1],
                 [2,6,4,5,0,7,9,9,9,4,1]])
print (data)

我想从所有数字(按列)不为 0 的地方获取数据;并且任何元素都不是 np.nan。

indices = np.any(data, axis=1)

print (data[indices])

预计是:

[[2 3 4 5 7 8 9 9 3]
 [3 3 6 5 7 9 9 9 3]
 [2 6 4 5 7 9 9 9 4]]

我尝试如下掩码。

mask = np.all(np.isnan(data) | np.equal(data, 0), axis=1)

print (data[~mask])



[[ 2.  3.  4.  5.  0.  7.  0.  9.  9.  3. nan]
 [ 3.  3.  6.  5.  0.  7.  9.  9.  9.  3.  1.]
 [ 2.  6.  4.  5.  0.  7.  9.  9.  9.  4.  1.]]

但不是预期的结果

【问题讨论】:

标签: python numpy


【解决方案1】:

沿列使用 np.any (axis=0)。将其与任何 np.isnan 结合使用 这将返回列索引,其中该列中的任何值都不为零且没有 nan。 然后使用这些索引原始数组。

mask = ~np.any(np.isnan(data),axis=0) &  np.any(data, axis=0)
indices=data[:,mask]

【讨论】:

  • 可以将[:,np.any(data,axis=0)]获取为真假。我需要用 np.nan 使它成为一个 linner(只获取任何非 np.nan 元素)。
  • 据我所知,您不能在一行代码中删除所有 nan 和所有零列。你可以做一个面具。 stackoverflow.com/questions/22032668/…
  • IndexError: 布尔索引与维度 0 上的索引数组不匹配;维度为 3,但对应的布尔维度为 11
  • data.T[np.any(data, axis=0)].T
  • @wwii 提问者正试图删除至少有一个 nan 值的列
【解决方案2】:

你可以这样做:

data[:,(~np.isnan(data)).all(axis=0)&~(data==0).any(axis=0)].astype("int")

输出:

[[2 3 4 5 7 8 9 9 3]
 [3 3 6 5 7 9 9 9 3]
 [2 6 4 5 7 9 9 9 4]]

【讨论】:

  • 如何将data[:,np.any(data,axis=0)]data[:,(~np.isnan(data)).all(axis=0)]) 组合在一起?
  • 但这是您预期的输出?那你为什么要把它结合起来呢?他们做不同的事情
  • 做一个班轮
  • 第一个获取至少有一个非 nan 元素的所有列,而第二个获取所有列,其中所有元素都是非 nan。
  • 好的,那么你的预期输出是什么?
猜你喜欢
  • 1970-01-01
  • 2017-06-05
  • 2021-01-26
  • 2011-05-05
  • 2016-05-18
  • 2016-09-09
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
相关资源
最近更新 更多