在python中,如何使用np数组有效地操作多维度?

时间:2017-03-16 06:00:04

标签: python numpy

我在数据集中有数万个32 X 32 RGB图像。例如

X_train,形状(123123,32,32,3)

我想将rgb变灰,并将形状更改为(123123,32,32,1)

我这里的代码非常不足,我想知道最好的方法是什么。我在AWS G2或P2主机上,所以我有GPU。

感谢。

def grayedOut(x) :
    out = []

    for n in range(len(x)) :
        nv = []
        for i in range(len(x[n])) :
            iv = []
            for j in range(len(x[n,i])) :
                r,g,b = x[n,i,j,0], x[n,i,j,1], x[n, i,j,2]
                gray = np.uint8(0.2989 * r + 0.5870 * g + 0.1140 * b)

                iv.append(np.asarray([gray]))
            nv.append(iv)
        out.append(nv)
    return np.asarray(out)

2 个答案:

答案 0 :(得分:3)

你可以简单地写

def grayedOut(x):
    return x.dot([0.2989, 0.5870, 0.1140])[..., np.newaxis].astype(np.uint8) 
  • x.dot([0.2989, 0.5870, 0.1140]):计算每个像素的灰色分量。生成的形状为(123123, 32, 32)
  • [..., np.newaxis]:为结果创建一个新轴,提供所需的形状(123123, 32, 32, 1)
  • .astype(np.uint8):将数据类型转换为uint8。

答案 1 :(得分:1)

假设images所有 RGB图像的数组。然后,以下代码生成灰度图像数组:

coeffs = np.array([0.2989, 0.5870, 0.1140])
gray = np.apply_along_axis(coeffs.dot, 3, images).astype(np.uint8)

我希望这段代码比你的三重循环更快。