我有一个在numpy中有两列的数组.例如:
a = array([[1, 5, nan, 6],
[10, 6, 6, nan]])
a = transpose(a)
Run Code Online (Sandbox Code Playgroud)
我想有效地遍历两列,一个[:,0]和一个[:,1]并删除满足某个条件的任何对,在这种情况下,如果它们是NaN.我能想到的显而易见的方法是:
new_a = []
for val1, val2 in a:
if val2 == nan or val2 == nan:
new_a.append([val1, val2])
Run Code Online (Sandbox Code Playgroud)
但这似乎很笨拙.什么是pythonic numpy方式这样做?
谢谢.
kra*_*oti 31
如果您只想获取没有NAN的行,那么这就是您需要的表达式:
>>> import numpy as np
>>> a[~np.isnan(a).any(1)]
array([[ 1., 10.],
[ 5., 6.]])
Run Code Online (Sandbox Code Playgroud)
如果您希望其元素中没有特定数字的行,例如5:
>>> a[~(a == 5).any(1)]
array([[ 1., 10.],
[ NaN, 6.],
[ 6., NaN]])
Run Code Online (Sandbox Code Playgroud)
后者显然相当于
>>> a[(a != 5).all(1)]
array([[ 1., 10.],
[ NaN, 6.],
[ 6., NaN]])
Run Code Online (Sandbox Code Playgroud)
说明:让我们首先创建您的示例输入
>>> import numpy as np
>>> a = np.array([[1, 5, np.nan, 6],
... [10, 6, 6, np.nan]]).transpose()
>>> a
array([[ 1., 10.],
[ 5., 6.],
[ NaN, 6.],
[ 6., NaN]])
Run Code Online (Sandbox Code Playgroud)
这确定了哪些元素是NAN
>>> np.isnan(a)
array([[False, False],
[False, False],
[ True, False],
[False, True]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
这标识哪些行具有任何True的元素
>>> np.isnan(a).any(1)
array([False, False, True, True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
既然我们不想要这些,我们否定最后一个表达式:
>>> ~np.isnan(a).any(1)
array([ True, True, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
最后我们使用布尔数组来选择我们想要的行:
>>> a[~np.isnan(a).any(1)]
array([[ 1., 10.],
[ 5., 6.]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12543 次 |
| 最近记录: |