在python中,如何使用np数组高效地处理多维数据?

在python中,如何使用np数组高效地处理多维数据?,python,numpy,Python,Numpy,我在数据集中有数万张32 X 32 RGB图像。例如 X_系列,形状(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

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

X_系列,形状(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)

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

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

我希望此代码比您的三重循环快。

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

coeffs = np.array([0.2989, 0.5870, 0.1140])
gray = np.apply_along_axis(coeffs.dot, 3, images).astype(np.uint8)
我希望此代码比您的三重循环快。

您只需编写

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
    • 你可以简单地写

      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

      这比我的好,但似乎没有Kenytm的快。无论如何,谢谢。这比我的好,但似乎没有肯尼特的快。无论如何谢谢你