Python 在Ndaray中出现列表

Python 在Ndaray中出现列表,python,numpy,image-processing,numpy-ndarray,Python,Numpy,Image Processing,Numpy Ndarray,我有一个RGB图像-ndarray-我想计算一些颜色的出现,比如[255,0,0]或[0,0255]在这张图像中 图像数据的示例 np.ones((3, 3, 3)) * 255 array([[[255., 255., 255.], [255., 255., 255.], [255., 255., 255.]], [[255., 255., 255.], [255., 255., 255.], [255., 255

我有一个RGB图像-ndarray-我想计算一些颜色的出现,比如[255,0,0]或[0,0255]在这张图像中

图像数据的示例

np.ones((3, 3, 3)) * 255

array([[[255., 255., 255.],
        [255., 255., 255.],
        [255., 255., 255.]],
       [[255., 255., 255.],
        [255., 255., 255.],
        [255., 255., 255.]],
       [[255., 255., 255.],
        [255., 255., 255.],
        [255., 255., 255.]]])

所以我想要这样的东西

{
'[255,255,255]' : 9,
}

一种解决方案可以是
计数器
功能:

from collections import Counter
import numpy as np

# Generate some data
data = np.ones((10, 20, 3)) * 255

# Convert to tuple list
data_tuple = [ tuple(x) for x in data.reshape(-1,3)]
Counter(data_tuple)
返回:

Counter({(255.0, 255.0, 255.0): 200})

这里有一种使用
NumPy
的方法。由于值的范围在0-255之间,我们可以将行视为元组,其中包含三个类型为
f8
的元素,并使用
np.unique
计算原始数据数组中实际行的出现次数。使用nakor的数组:

a = np.ones((10, 20, 3)) * 255
我们可以这样做:

vals, counts = np.unique(a.view('f8,f8,f8'), return_counts=True)
其中:

print(vals)
array([(255., 255., 255.)],
      dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<f8')])

print(counts)
array([200])
打印(VAL)
数组([(255,255,255.)],

dtype=[('f0','虽然可以使用
计数器
或计算每个像素的频率,但对于特定像素,更有效的方法是:

import numpy as np

ar = np.ones([3,3,3]) *255
ar[1,1,:] = [0, 0, 200]

pixels = dict()
pixels['[255, 255, 255]'] =  np.sum(np.all(ar == [255,255, 255], axis = 2))
pixels['[0, 0, 200]'] =  np.sum(np.all(ar == [0, 0, 200], axis = 2)) 

结果:
{'[255,255,255]':8'[0,0200]':1}

我添加了一个示例。因此,一般来说,RGB图像的维度是(宽度、高度、3)np。唯一性可以在链接的dupe@MatteoPeluso中使用,作为1d数组。但是使用2D数组则有点棘手:)我尝试使用真实图片,但出现了以下错误
ValueError:当更改为较大的数据类型时,其大小必须是数组最后一个轴的总大小(以字节为单位)的除数。
谢谢您的回答。它工作得很好,但需要很长时间