gpt4 book ai didi

python - 设置 numpy 数组阈值的最快方法是什么?

转载 作者:太空狗 更新时间:2023-10-30 00:44:20 24 4
gpt4 key购买 nike

我想要结果数组作为二进制是/否。

我想到了

    img = PIL.Image.open(filename)

array = numpy.array(img)
thresholded_array = numpy.copy(array)

brightest = numpy.amax(array)
threshold = brightest/2

for b in xrange(490):
for c in xrange(490):
if array[b][c] > threshold:
thresholded_array[b][c] = 255
else:
thresholded_array[b][c] = 0

out=PIL.Image.fromarray(thresholded_array)

但是一次遍历数组一个值非常非常慢,我知道一定有更快的方法,什么是最快的?

最佳答案

您可以通过多种方式一次比较整个数组,而不是循环。从

开始
>>> arr = np.random.randint(0, 255, (3,3))
>>> brightest = arr.max()
>>> threshold = brightest // 2
>>> arr
array([[214, 151, 216],
[206, 10, 162],
[176, 99, 229]])
>>> brightest
229
>>> threshold
114

方法#1:使用np.where:

>>> np.where(arr > threshold, 255, 0)
array([[255, 255, 255],
[255, 0, 255],
[255, 0, 255]])

方法#2:使用 bool 索引创建一个新数组

>>> up = arr > threshold
>>> new_arr = np.zeros_like(arr)
>>> new_arr[up] = 255

方法#3:做同样的事情,但使用算术技巧

>>> (arr > threshold) * 255
array([[255, 255, 255],
[255, 0, 255],
[255, 0, 255]])

这是有效的,因为 False == 0True == 1


对于 1000x1000 的数组,看起来算术 hack 对我来说是最快的,但老实说我会使用 np.where 因为我认为它最清楚:

>>> %timeit np.where(arr > threshold, 255, 0)
100 loops, best of 3: 12.3 ms per loop
>>> %timeit up = arr > threshold; new_arr = np.zeros_like(arr); new_arr[up] = 255;
100 loops, best of 3: 14.2 ms per loop
>>> %timeit (arr > threshold) * 255
100 loops, best of 3: 6.05 ms per loop

关于python - 设置 numpy 数组阈值的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31064974/

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