首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >替换Python NumPy数组中所有大于某个值的元素

替换Python NumPy数组中所有大于某个值的元素
EN

Stack Overflow用户
提问于 2013-10-30 02:42:54
回答 8查看 475.2K关注 0票数 230

我有一个2D NumPy数组,希望将其中大于或等于阈值T的所有值替换为255.0。据我所知,最基本的方法是:

代码语言:javascript
复制
shape = arr.shape
result = np.zeros(shape)
for x in range(0, shape[0]):
    for y in range(0, shape[1]):
        if arr[x, y] >= T:
            result[x, y] = 255

  1. 执行此操作的最简洁和pythonic式的方式是什么?
  2. 是否有更快的方式(可能不那么简洁和/或pythonic式的方式)?

这将是用于人头MRI扫描的窗口/水平调整子例程的一部分。2Dnumpy数组是图像像素数据。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-10-30 02:46:06

我认为最快也是最简洁的方法就是使用NumPy内置的Fancy索引。如果您有一个名为arrndarray,则可以将所有元素>255替换为值x,如下所示:

代码语言:javascript
复制
arr[arr > 255] = x

我用一个500x500的随机矩阵在我的机器上运行了这个过程,用5替换了所有>0.5的值,平均花费了7.59ms。

代码语言:javascript
复制
In [1]: import numpy as np
In [2]: A = np.random.rand(500, 500)
In [3]: timeit A[A > 0.5] = 5
100 loops, best of 3: 7.59 ms per loop
票数 411
EN

Stack Overflow用户

发布于 2013-10-30 03:47:27

由于您实际上需要一个不同的数组,其中arr < 255arr,否则为255,因此可以简单地完成此操作:

代码语言:javascript
复制
result = np.minimum(arr, 255)

更一般地,对于下界和/或上界:

代码语言:javascript
复制
result = np.clip(arr, 0, 255)

如果你只想访问超过255的值,或者更复杂的东西,@mtitan8的答案更一般,但对于你的情况,np.clipnp.minimum (或np.maximum)更好,速度也更快:

代码语言:javascript
复制
In [292]: timeit np.minimum(a, 255)
100000 loops, best of 3: 19.6 µs per loop

In [293]: %%timeit
   .....: c = np.copy(a)
   .....: c[a>255] = 255
   .....: 
10000 loops, best of 3: 86.6 µs per loop

如果要就地执行此操作(即,修改arr而不是创建result),可以使用np.minimumout参数

代码语言:javascript
复制
np.minimum(arr, 255, out=arr)

代码语言:javascript
复制
np.clip(arr, 0, 255, arr)

( out=名称是可选的,因为参数的顺序与函数的定义顺序相同。)

对于就地修改,布尔索引大大加快了速度(无需单独制作和修改副本),但仍然不如minimum

代码语言:javascript
复制
In [328]: %%timeit
   .....: a = np.random.randint(0, 300, (100,100))
   .....: np.minimum(a, 255, a)
   .....: 
100000 loops, best of 3: 303 µs per loop

In [329]: %%timeit
   .....: a = np.random.randint(0, 300, (100,100))
   .....: a[a>255] = 255
   .....: 
100000 loops, best of 3: 356 µs per loop

作为比较,如果您想用最小值和最大值来限制您的值,如果没有clip,您将不得不这样做两次,如下所示

代码语言:javascript
复制
np.minimum(a, 255, a)
np.maximum(a, 0, a)

或,

代码语言:javascript
复制
a[a>255] = 255
a[a<0] = 0
票数 57
EN

Stack Overflow用户

发布于 2017-01-10 05:13:27

我认为使用where函数可以最快地实现这一点:

例如,在numpy数组中查找大于0.2的项,并将其替换为0:

代码语言:javascript
复制
import numpy as np

nums = np.random.rand(4,3)

print np.where(nums > 0.2, 0, nums)
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19666626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档