我需要操作一个大的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
是否有一个可以加快速度的numpy功能?
答案 0 :(得分:91)
>>> 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]])
您可以通过以下方式缩短:
>>> c = (a < 3).astype(int)
答案 1 :(得分:55)
>>> 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]])
>>>
答案 2 :(得分:27)
最快(也是最灵活)的方式是使用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)
将产生:
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]]
答案 3 :(得分:3)
您可以像这样一步创建掩码数组
mask_data = input_mask_data < 3
这会创建一个布尔数组,然后可以将其用作像素掩码。请注意,我们没有更改输入数组(如在代码中),但创建了一个新数组来保存掩码数据 - 我建议这样做。
>>> input_mask_data = np.random.randint(0, 5, (3, 4))
>>> input_mask_data
array([[1, 3, 4, 0],
[4, 1, 2, 2],
[1, 2, 3, 0]])
>>> mask_data = input_mask_data < 3
>>> mask_data
array([[ True, False, False, True],
[False, True, True, True],
[ True, True, False, True]], dtype=bool)
>>>
答案 4 :(得分:0)
我不确定我理解你的问题,但是如果你写的话:
mask_data[:3, :3] = 1
mask_data[3:, 3:] = 0
这将使x和y索引小于3的掩码数据的所有值等于1,所有其余值等于0