2017-08-10 119 views
2

在一个numpy数组中,我想将所有naninf替换为一个固定数字。我可以在一个步骤中做到这一点,以节省计算时间(数组非常大)?python:在numpy中组合掩码

a = np.arange(10.0) 
a[3] = np.nan 
a[5] = np.inf 
a[7] = -np.inf 
# a: [ 0. 1. 2. nan 4. inf 6. -inf 8. 9.] 

a[np.isnan(a)] = -999 
a[np.isinf(a)] = -999 
# a: [ 0. 1. 2. -999. 4. -999. 6. -999. 8. 9.] 

上面的代码工作正常。但我正在寻找类似的东西:

a[np.isnan(a) or np.isinf(a)] = -999 

哪一个不工作,我可以看到为什么。只是想,如果每个项目只检查一次可能会更好。

回答

2

这似乎工作:

a[np.isnan(a) | np.isinf(a)] = 2 

np.isnan()np.isinf()事实上返回两个布尔numpy的阵列。

布尔numpy数组可以结合按位操作,如&和|

+0

精彩! “或”和“|”之间有什么区别?也许按位逻辑?顺便说一下,我刚刚测试过它:组合版本更快速地变成了10%。编辑:好的,我明白了。谢谢! – offeltoffel

3

numpy的本身自带的量化的或版本:

a[np.logical_or(np.isnan(a), np.isinf(a))] = -999 

虽然上述版本是明确understanable,有一个快一些,这是一个有点怪异:

a[np.isnan(a-a)] = -9999 

的想法这背后是,“np.inf-np.inf = np.nan`

%timeit a[np.isnan(a-a)] = -999 
# 100000 loops, best of 3: 11.7 µs per loop 
%timeit a[np.isnan(a) | np.isinf(a)] = -999 
# 10000 loops, best of 3: 51.4 µs per loop 
%timeit a[np.logical_or(np.isnan(a), np.isinf(a))] = -999 
# 10000 loops, best of 3: 51.4 µs per loop 

因此,|np.logical_or版本似乎是内部等效

+1

numpy是一件奇迹般的事 – offeltoffel

3

你可以使用np.isfinite它证明一个数是不是无限的,也不是楠:

a[~np.isfinite(a)] = -999 
+0

这看起来也不错! 〜做什么? – offeltoffel

+1

'〜'是逻辑*不*。 –