如果满足条件,则替换Numpy元素

Chr*_*Fro 69 python arrays conditional numpy

我需要操作一个大的numpy数组,以便在满足条件时将每个元素更改为1或0(稍后将用作像素掩码).数组中有大约800万个元素,我的当前方法对于缩减管道来说需要太长时间:

for (y,x), value in numpy.ndenumerate(mask_data): 

    if mask_data[y,x]<3: #Good Pixel
        mask_data[y,x]=1
    elif mask_data[y,x]>3: #Bad Pixel
        mask_data[y,x]=0
Run Code Online (Sandbox Code Playgroud)

是否有一个numpy函数可以加快这个速度?

Ste*_*nes 102

>>> import numpy as np
>>> a = np.random.randint(0, 5, size=(5, 4))
>>> a
array([[4, 2, 1, 1],
       [3, 0, 1, 2],
       [2, 0, 1, 1],
       [4, 0, 2, 3],
       [0, 0, 0, 2]])
>>> b = a < 3
>>> b
array([[False,  True,  True,  True],
       [False,  True,  True,  True],
       [ True,  True,  True,  True],
       [False,  True,  True, False],
       [ True,  True,  True,  True]], dtype=bool)
>>> 
>>> c = b.astype(int)
>>> c
array([[0, 1, 1, 1],
       [0, 1, 1, 1],
       [1, 1, 1, 1],
       [0, 1, 1, 0],
       [1, 1, 1, 1]])
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式缩短:

>>> c = (a < 3).astype(int)
Run Code Online (Sandbox Code Playgroud)

  • 如何在特定列上实现这种情况,而无需切掉某些列然后再次分配回来?例如,只有列[2, 3]中的元素在满足条件时应该改变值,而其他列无论条件满足与否都不会改变。 (2认同)

ev-*_*-br 63

>>> a = np.random.randint(0, 5, size=(5, 4))
>>> a
array([[0, 3, 3, 2],
       [4, 1, 1, 2],
       [3, 4, 2, 4],
       [2, 4, 3, 0],
       [1, 2, 3, 4]])
>>> 
>>> a[a > 3] = -101
>>> a
array([[   0,    3,    3,    2],
       [-101,    1,    1,    2],
       [   3, -101,    2, -101],
       [   2, -101,    3,    0],
       [   1,    2,    3, -101]])
>>>
Run Code Online (Sandbox Code Playgroud)

参见,例如,使用布尔数组进行索引.

  • 好东西,谢谢!如果要引用更改的值,则可以使用类似“ a [a&gt; 3] = -101 + a [a&gt; 3]”的名称。 (3认同)
  • @pexmar虽然如果你做`a[a &gt; 3] = -101+a[a &gt; 3]`而不是`a[a &gt; 3] += -101`,你很可能会面临内存泄漏。 (3认同)
  • 您如何引用 pexmar 询问的更改值? (2认同)

Mar*_*hke 29

最快(和最灵活的)的方式是使用np.where根据掩模(真假值的阵列),其中两个阵列之间选择:

import numpy as np
a = np.random.randint(0, 5, size=(5, 4))
b = np.where(a<3,0,1)
print('a:',a)
print()
print('b:',b)
Run Code Online (Sandbox Code Playgroud)

这将产生:

a: [[1 4 0 1]
 [1 3 2 4]
 [1 0 2 1]
 [3 1 0 0]
 [1 4 0 1]]

b: [[0 1 0 0]
 [0 1 0 1]
 [0 0 0 0]
 [1 0 0 0]
 [0 1 0 0]]
Run Code Online (Sandbox Code Playgroud)

  • 如果不满足条件,我不想用任何东西替换,那么最好的方法是什么?即仅在满足条件时替换为提供的值,如果不保留原始数字...... (3认同)
  • 要替换 a 中小于 3 的所有值并保持其余值不变,请使用 `a[a&lt;3] = 0` (2认同)