numpy直方图,3x3D数组作为索引

ajw*_*ood 3 python numpy

我有3x3D阵列,它是3D rgb图像的红色,绿色和蓝色通道.在numpy中创建输入通道的直方图体积的优雅方法是什么?

该操作相当于

""" assume R, G and B are 3D arrays and output is a 3D array filled with zeros """
for x in x_dim:
     for y in y_dim:
          for z in z_dim:
               output[ R[x][y][z] ][ G[x][y][z] ][ B[x][y][z] ] += 1
Run Code Online (Sandbox Code Playgroud)

此代码对于大图像来说太慢了.numpy可以提高上述算法的效率吗?

dep*_*ted 7

您可以使用它,numpy.histogramdd但正如您所说,@ jozzas提出的方法将无法正常工作.您需要做的是展平三个3D阵列中的每一个,然后将它们组合成一个二维的维数阵列,然后(x_dim*y_dim*z_dim, 3)传递给它们histogramdd.原始数据是3D的事实是红鲱鱼,因为空间信息与计算直方图无关.

以下是使用通道立方体中的随机数据的示例:


import numpy 

n = 400  # approximate largest cube size that works on my laptop
# Fill channel cubes with random 8-bit integers
r = numpy.random.randint(256, size=(n,n,n)).astype(numpy.uint8)
g = numpy.random.randint(256, size=(n,n,n)).astype(numpy.uint8)
b = numpy.random.randint(256, size=(n,n,n)).astype(numpy.uint8)

# reorder data into for suitable for histogramming
data = numpy.vstack((r.flat, g.flat, b.flat)).astype(numpy.uint8).T

# Destroy originals to save space
del(r); del(g); del(b)

m = 256                                  # size of 3d histogram cube
hist, edges = numpy.histogramdd(
    data, bins=m, range=((-0.5,255.5),(-0.5,255.5),(-0.5,255.5))
    )

# Check that it worked
assert hist.sum() == n**3, 'Failed to conserve pixels'
Run Code Online (Sandbox Code Playgroud)

这确实使用了比你预期的更多的内存,因为histogramdd似乎使用64位浮点数来完成它的工作,即使我们发送它是8位整数.