gpt4 book ai didi

python - 如何更快地处理nparrays

转载 作者:行者123 更新时间:2023-12-02 16:48:36 25 4
gpt4 key购买 nike

我将两个图像加载到两个numpy数组中。我想得到它们的区别,并删除小于50的值,并将其其余部分设置为255,以得到最终的黑白图像结果。

def count(base, image):
x, y, z = base.shape
sheet = np.zeros(base.shape)
for i in range(x):
for j in range(y):
temp = 0
for k in range(z):
if base[i, j, k] > image[i, j, k]:
t = base[i, j, k] - image[i, j, k]
if t > 50:
temp = 255
else:
t = image[i, j, k] - base[i, j, k]
if t > 50:
temp = 255
sheet[i, j] = [temp, temp, temp]

array = sheet[:, :, 0]

此代码执行了我需要的操作。但是如您所见,我为此功能使用了最简单的for循环,并且图像的大小为2000 * 2000,因此处理时间很长。我需要一种以更快的方式重写它的方法。

谢谢

最佳答案

向量化代码看起来很简单,除了一个陷阱:您的数据似乎是无符号的int(从外观上看是uint8),由于它们经常下溢并产生意外结果,因此需要格外注意。例如,明显的np.abs(image-base)>50不能检测大于50的差异,实际上np.abs是对未签名数据的nop。仔细的翻译看起来更像

sheet = np.array([[0,0,0],[255,255,255]], 'u1')[((np.maximum(base, image)-np.minimum(base, image))>50).any(2).view('u1')]

要么
sheet = np.array([[0,0,0],[255,255,255]], 'u1')[(np.abs(np.subtract(image, base, dtype='i2'))>50).any(2).view('u1')]

这个
  • 正确计算子像素的明智差异,
  • 第一个版本模仿您的if / else子句
  • 第二个强制差异值
  • 的签名结果类型 'i2'int16
  • 检测到那些大于50的
  • 用至少一个这样的子像素(any(2))标记像素,
  • 将生成的 bool(boolean) 掩码转换为索引(.view('u1'))0和1
  • ,并使用它们来索引到模板数组中。
  • 关于python - 如何更快地处理nparrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55216190/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com