【问题标题】:How to flatten a 3d array to 1d array如何将 3d 数组展平为 1d 数组
【发布时间】:2020-01-30 21:15:16
【问题描述】:

我需要一个 3d 嵌套数组。如何将其展平为一维数组? (因为性能)我假设我需要乘一些东西等等,但我不是最伟大的数学家。 谢谢!

def imgRGB(im):
    width, height = im.size

    #create matrix
    matrix = []
    for i in range(height):
        matrix.append([[0,0,0] for _ in range(width)])

    #get the rgb values
    for x in range(width):
        for y in range(height):
            r,g,b = im.getpixel((x,y))
            matrix[y][x][0] = r
            matrix[y][x][1] = g
            matrix[y][x][2] = b
    return matrix

像素值将与其他 RGB 值进行比较以找到最接近的匹配项。

def getNearestColor(rgb):
    a = []
    for i in range(len(rgbValues)):
        d = ((rgbValues[i][0]-rgb[0])*0.3)**2 + ((rgbValues[i][1]-rgb[1])*0.59)**2 + ((rgbValues[i][2]-rgb[2])*0.11)**2
        a.append(d)
    list.sort(a)
    return a[0]

【问题讨论】:

  • 不要认为我们这里有最伟大的读心者。你能发布一个 mcve - stackoverflow.com/help/minimal-reproducible-example吗?
  • 您已标记 NumPy,但您的代码实际上并未使用 NumPy。您已经创建了一个嵌套列表。 NumPy 数组效率更高。我不知道您使用的是什么图像库,但它可能有一种方便的内置方法来获取 NumPy 数组。此外,如果您确实需要展平您的数据结构(听起来您可能不需要),NumPy 数组有一个 flatten 方法(或 ravel,如果视图没问题)。
  • 什么时候必须展平数据结构? (性能相关)
  • 我正在使用 PIL(低)
  • 您可以从 Pillow 图像中获取 NumPy 数组,使用 numpy.asarray(im) 获取图像的只读视图,或使用 numpy.array(im) 获取图像数据副本支持的可修改数组。至于扁平化以提高性能,一般没有理由期望扁平化数据结构能够带来有意义的性能改进。它可能会有所帮助,它可能实际上什么也没做,甚至可能会造成伤害,这取决于您正在做什么以及低级实现细节的工作方式。在这里,我想说的是,在担心扁平化是否有帮助之前,您应该专注于利用 NumPy。

标签: python arrays python-3.x numpy multidimensional-array


【解决方案1】:

您可以使用 ndarray.flatten,在您的示例中它将是 matrix.flatten()。这将返回矩阵的展平版本。文档here 也有一个例子。

【讨论】:

    【解决方案2】:

    如果我理解正确,您需要执行以下操作:

    rgbValues = np.array(im).reshape(-1,3)
    a = np.sort(np.sum(((rgbValues - rgb)* [0.3, 0.59, 0.11])**2, axis=1))
    

    其中rgb 是列表[r, g, b] 用于某些值r、g、b。

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 2020-11-01
      • 2021-10-25
      • 2022-10-01
      • 2020-04-22
      • 2021-02-25
      • 2013-01-08
      • 1970-01-01
      • 2019-11-08
      相关资源
      最近更新 更多