我正在尝试为图像制作像素直方图。我有一个名为 image 的数组,看起来像这样
array([[[ 0, 0, 18, ..., 3, 0, 11],
[ 5, 18, 0, ..., 16, 16, 11],
[13, 0, 5, ..., 13, 19, 14],
...,
[ 0, 0, 0, ..., 9, 0, 8],
[ 4, 0, 0, ..., 0, 24, 0],
[19, 12, 16, ..., 0, 16, 21]],
[[17, 13, 0, ..., 9, 0, 0],
[ 0, 0, 0, ..., 4, 0, 0],
[14, 0, 2, ..., 0, 23, 0],
...,
[ 0, 6, 12, ..., 0, 22, 0],
[ 0, 0, 20, ..., 9, 7, 0],
[ 0, 8, 0, ..., 0, 15, 21]],
[[ 4, 9, 3, ..., 0, 15, 20],
[21, 16, 0, ..., 0, 8, 18],
[ 0, 0, 0, ..., 0, 0, 18],
...,
[ 0, 10, 7, ..., 26, 0, 8],
[15, 25, 16, ..., 17, 0, 18],
[ 0, 11, 0, ..., 25, 0, 0]]], dtype=uint8)
我想使用list comphrehension修剪此列表,并仅保留大于某个最大值的值。但是Python正在抛出这个 ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all(),即使使用.any()或.all()使程序运行,它也不是理想的输出。如何仅保留列表中大于指定最大值的值?
y, x = image.shape[0],image.shape[1]
pixels = [image[j, i] \
for i in range(x) \
for j in range(y) \
if image[j, i] < max_value]
答案 0 :(得分:2)
根据您的条件创建一个布尔数组,并使用它来索引原始数组。
>>> img
array([[[200, 150, 80, 200],
[200, 150, 80, 200],
[200, 150, 80, 200]],
[[200, 150, 80, 200],
[200, 150, 80, 200],
[200, 150, 80, 200]],
[[200, 150, 80, 200],
[200, 150, 80, 200],
[200, 150, 80, 200]]])
>>> b = img < 100
>>> b
array([[[False, False, True, False],
[False, False, True, False],
[False, False, True, False]],
[[False, False, True, False],
[False, False, True, False],
[False, False, True, False]],
[[False, False, True, False],
[False, False, True, False],
[False, False, True, False]]], dtype=bool)
>>> pixels = img[b]
>>> pixels
array([80, 80, 80, 80, 80, 80, 80, 80, 80])
>>> list(pixels)
[80, 80, 80, 80, 80, 80, 80, 80, 80]
>>>
或者简单地说:
>>> img[img < 100]
array([80, 80, 80, 80, 80, 80, 80, 80, 80])
>>>