python:numpy中的组合掩蔽

问题描述 投票:2回答:3

在一个numpy数组中,我想将所有naninf替换为固定数字。我可以一步到位来节省计算时间(数组真的很大)吗?

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的每个项目可能会更好。

python numpy nan
3个回答
2
投票

这似乎工作:

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

np.isnan()np.isinf()实际上返回两个布尔numpy数组。

boolean numpy数组可以与按位运算结合使用,例如&和|


3
投票

Numpy带有自己的矢量化版本或:

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版本似乎在内部相当


3
投票

您可以使用np.isfinite来验证数字不是无穷大也不是NaN:

a[~np.isfinite(a)] = -999
© www.soinside.com 2019 - 2024. All rights reserved.