【问题标题】:How to transpose an array in Python with no imports?如何在没有导入的情况下在 Python 中转置数组?
【发布时间】:2021-10-08 07:47:34
【问题描述】:

我正在做一个图像处理练习。任务非常简单。首先,我从一个包含 75 行和每行 300 个值的 .ppm 文件中检索一个数组。这些值对应于 RGB (0-255) 中的像素颜色。然后,我必须显示图像。到目前为止一切都很好,但下一个任务是将图像更改为灰度版本。所以我使用LUMA formula 将一行中的每组三个值转换为与灰度对应的单个值。然后,我让程序将该值存储在一个新的 .ppm 文档中(任务的一部分)。但是,因为 Python 一次读取一列,所以它将列中的值存储为一行。本质上,它转置了数据,所以我最终得到 100 行 75 个值,而不是 75 行 100 个值。如何转置此数组以便将信息正确存储到 .ppm 文档中?

这就是我所做的。 s[0] 是数组的“宽度”,s[1] 是“高度”。

with open("greyscalepizza.ppm", "w+") as g:
    g.write("P2 \n100 75 \n255")
    for i in range(s[0]):
        for j in range(s[1]):
            if j%int(s[1])==0:
                g.write("\n")
            pixels[j][3*i]=round(0.299*pixels[j][3*i])
            pixels[j][(3*i)+1]=round(0.587*pixels[j][(3*i)+1])
            pixels[j][(3*i)+2]=round(0.114*pixels[j][(3*i)+2])
            gray = pixels[j][3*i]+pixels[j][(3*i)+1]+pixels[j][(3*i)+2]
            g.write("{:.0f} ".format(gray))

【问题讨论】:

  • 交换你的 for 循环?

标签: python arrays image-processing


【解决方案1】:

要转置一个没有导入的 2 x 2 矩阵,我创建了一个函数,您可以在下面的示例代码中看到它。我不知道这是否适用于数组。

def transposeMatrix(m):
    return map(list,zip(*m))

def getMatrixMinor(m,i,j):
    return [row[:j] + row[j+1:] for row in (m[:i]+m[i+1:])]

def getMatrixDeternminant(m):
    #base case for 2x2 matrix
    if len(m) == 2:
        return m[0][0]*m[1][1]-m[0][1]*m[1][0]

    determinant = 0
    for c in range(len(m)):
        determinant += ((-1)**c)*m[0][c]*getMatrixDeternminant(getMatrixMinor(m,0,c))
    return determinant

def getMatrixInverse(m):
    determinant = getMatrixDeternminant(m)
    #special case for 2x2 matrix:
    if len(m) == 2:
        return [[m[1][1]/determinant, -1*m[0][1]/determinant],
                [-1*m[1][0]/determinant, m[0][0]/determinant]]

    #find matrix of cofactors
    cofactors = []
    for r in range(len(m)):
        cofactorRow = []
        for c in range(len(m)):
            minor = getMatrixMinor(m,r,c)
            cofactorRow.append(((-1)**(r+c)) * getMatrixDeternminant(minor))
        cofactors.append(cofactorRow)
    cofactors = transposeMatrix(cofactors)
    for r in range(len(cofactors)):
        for c in range(len(cofactors)):
            cofactors[r][c] = cofactors[r][c]/determinant
    return cofactors

invM=getMatrixInverse(twoD)

import sys
for i in invM:
    for j in i:
        print(j,end=" ")

【讨论】:

    【解决方案2】:

    要转置大小为 s[0]xs[1] 的数组 pixel,可以通过以下方式进行。

    for i in range(s[0]):
        for j in range(i+1, s[1]):
            temp=pixel[i][j]
            pixel[i][j]=pixel[j][i]
            pixel[j][i]=temp
    

    这将在 O(s[0]*s[1]) 中转置数组。

    【讨论】:

      猜你喜欢
      • 2012-07-09
      • 2018-11-10
      • 2023-01-10
      • 2013-04-17
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多