在一个 numpy 数组中,我想将所有的 nan
和 inf
替换成一个固定的数字。我可以一步完成以节省计算时间吗(数组真的很大)?
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
这是行不通的,我明白为什么了。只是想如果 a 的每个项目都只检查一次可能会更好。
最佳答案
Numpy 带有自己的向量化版本的 or:
a[np.logical_or(np.isnan(a), np.isinf(a))] = -999
虽然上面的版本清晰易懂,但还有一个更快的版本,有点奇怪:
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
版本在内部似乎是等价的
关于python:numpy中的组合掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45614447/