Python-NumPy-tuples作为数组元素

2024-06-02 06:47:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一名主修计算机科学的大学生,正在为我的Calc I I I课程做一个编程项目,涉及奇异值分解。其基本思想是将m x n维的图像转换为mxn矩阵,其中每个元素是表示点(m,n)处像素的颜色通道(r,g,b)的元组。我之所以使用Python,是因为它是迄今为止我所教过的唯一一门语言。

据我所知,Python通常不喜欢元组作为数组的元素。我自己做了一点研究,找到了一个解决办法,即按如下方式预先分配数组:

def image_to_array(): #converts an image to an array  
    aPic = loadPicture("zorak_color.gif")  
    ph = getHeight(aPic)  
    pw = getWidth(aPic)  
    anArray = zeros((ph,pw), dtype='O')  
    for h in range(ph):  
         for w in range(pw):             
            p = getPixel(aPic, w, h)  
            anArray[h][w] = (getRGB(p))  
    return anArray

这对作业的第一部分来说是正确的,那就是将图像转换成矩阵(不涉及线性代数)。

不过,SVD的部分是它变得更棘手的地方。当我调用内置的numPy svd函数时,使用从我的图像构建的数组(其中每个元素都是元组),我得到以下错误:

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in -toplevel-
    svd(x)
  File "C:\Python24\Lib\site-packages\numpy\linalg\linalg.py", line 724, in svd
    a = _fastCopyAndTranspose(t, a)
  File "C:\Python24\Lib\site-packages\numpy\linalg\linalg.py", line 107, in _fastCopyAndTranspose
    cast_arrays = cast_arrays + (_fastCT(a.astype(type)),)
ValueError: setting an array element with a sequence.

在我做一些研究并发现我可以预先分配数组以允许元组作为元素之前,这也是我最初遇到的错误。

现在的问题是,我只是在我的(大学水平)编程的第一个学期,这些numPy函数是由专业程序员编写和为专业程序员编写的,对我来说有点太黑了(尽管我相信它们对有经验的人来说要清楚得多)。因此,编辑这些函数以允许元组比我在自己的函数上进行编辑时要复杂一些。我需要从这里去哪里?我想我应该把相关的numPy函数复制到我自己的程序中,并相应地修改它们?

提前谢谢。


Tags: 函数in图像numpyan元素数组array
2条回答

与其将数组元素类型设置为“O”(对象),不如将其设置为元组。有关一些示例,请参见the SciPy manual

在你的情况下,最简单的方法是

a = zeros((ph,pw), dtype=(float,3))

假设RGB值是3个浮点数的元组。

这类似于创建一个3d数组(正如Steve所建议的那样),实际上,元组元素被访问为a[n,m][k]z[n,m,k],其中k是元组中的元素。

当然,SVD是为2d矩阵而不是3d数组定义的,因此不能使用linalg.SVD(a)。你必须决定你需要什么样的矩阵(三种可能的矩阵:R G和B)的SVD。

例如,如果您希望“R”矩阵的SVD(假设它是元组的第一个元素)使用如下内容:

linalg.svd(a[:,:,1])

我想您需要一个phby pwby 3numpy数组。

anArray = zeros((ph,pw,3))  
for h in range(ph):  
     for w in range(pw):             
        p = getPixel(aPic, w, h)  
        anArray[h][w] = getRGB(p)

您只需要确保getRGB返回一个3元素列表,而不是一个元组。

相关问题 更多 >