python:numpy中的组合掩码

标签 python numpy nan

在一个 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 的每个项目都只检查一次可能会更好。

最佳答案

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/

相关文章:

python - 无法使用 API Gateway 运行 AWS Lambda 函数

python - 将数字字符引用符号转换为 unicode 字符串

python - 6.5 GB 文件上的 Pandas read_csv 消耗超过 170GB RAM

c++ - 负NaN不是NaN吗?

android-ndk - Android NDK : ARMv6 + VFP devices. 错误计算、NaN、非正规数、VFP11 bug

Python 数据包嗅探/数据包捕获 - pcapy 不捕获数据包

python - 第二种滤除非黑色像素方式的实现

python - 在 Python 中初始化空矩阵

python - Numba 没有提高性能

python - 1**math.nan 和 0j**math.nan 的惊喜