gpt4 book ai didi

python - numpy.ndarray 中值的计数

转载 作者:太空宇宙 更新时间:2023-11-03 21:17:38 24 4
gpt4 key购买 nike

有没有办法在纯 numpy(或 opencv)中执行以下操作?

img = cv2.imread("test.jpg")
counts = defaultdict(int)
for row in img:
for val in row:
counts[tuple(val)] += 1

问题是 tuple(val) 显然可以是 2^24 个不同值之一,因此不可能为每个可能的值都创建一个数组,因为它会很大并且大部分为零,所以我需要一个更高效的数据结构。

最佳答案

解决此问题的最快方法是,如果图像以“ block 状”格式存储,即颜色平面维度是最后一个,并且最后一个维度是连续的,则采用 np.void查看每 24 位像素,然后通过 np.uniquenp.bincount 运行结果:

>>> arr = np.random.randint(256, size=(10, 10, 3)).astype(np.uint8)
>>> dt = np.dtype((np.void, arr.shape[-1]*arr.dtype.itemsize))
>>> if arr.strides[-1] != arr.dtype.itemsize:
... arr = np.ascontiguousarray(arr)
...
>>> arr_view = arr.view(dt)

arr_view 的内容看起来像垃圾:

>>> arr_view [0, 0]
array([Â],
dtype='|V3')

但不是我们必须理解内容:

>>> unq, _ = np.unique(arr_view, return_inverse=True)
>>> unq_cnts = np.bincount(_)
>>> unq = unq.view(arr.dtype).reshape(-1, arr.shape[-1])

现在您在这两个数组中拥有唯一像素及其计数:

>>> unq[:5]
array([[ 0, 82, 78],
[ 6, 221, 188],
[ 9, 209, 85],
[ 14, 210, 24],
[ 14, 254, 88]], dtype=uint8)
>>> unq_cnts[:5]
array([1, 1, 1, 1, 1], dtype=int64)

关于python - numpy.ndarray 中值的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19919442/

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