首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作为数组元素的Python - NumPy - tuples

作为数组元素的Python - NumPy - tuples
EN

Stack Overflow用户
提问于 2010-11-20 12:18:43
回答 2查看 48.3K关注 0票数 15

我是大学计算机科学专业的学生,正在为我的Calc III课程做一个涉及奇异值分解的编程项目。其思想基本上是将m×n维的图像转换成m×n矩阵,其中每个元素是表示点(m,n)处的像素的颜色通道(r,g,b)的元组。我之所以使用Python,是因为到目前为止,Python是我唯一真正(学得很好)的语言。

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

代码语言:javascript
复制
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函数时,我得到以下错误:

代码语言:javascript
复制
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函数复制到我自己的程序中,并相应地修改它们?

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2010-11-20 16:25:02

您应该将数组元素类型设置为元组,而不是将其设置为'O‘(对象)。有关示例,请参阅the SciPy manual

在您的示例中,最简单的方法是使用类似于

代码语言:javascript
复制
a = zeros((ph,pw), dtype=(float,3))

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

当然,奇异值分解是针对2维矩阵而不是3维数组定义的,因此您不能使用linalg.svd(a)。你必须决定你需要什么矩阵的奇异值分解(三个可能的矩阵:R,G和B)。

例如,如果您想要计算"R“矩阵的奇异值分解(假设它是元组的第一个元素),请使用如下内容:

代码语言:javascript
复制
linalg.svd(a[:,:,1])
票数 15
EN

Stack Overflow用户

发布于 2010-11-20 12:53:59

我想你需要一个ph by pw by 3 numpy数组。

代码语言:javascript
复制
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个元素的列表,而不是元组。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4231190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档