【发布时间】:2011-05-12 23:37:57
【问题描述】:
我是一名大学计算机科学专业的学生,正在为我的 Calc III 课程编写一个涉及奇异值分解的编程项目。这个想法基本上是将 m x n 维的图像转换为 m x n 矩阵,其中每个元素是表示点 (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 函数复制到我自己的程序中,并相应地修改它们?
提前致谢。
【问题讨论】:
-
SVD 仅适用于矩阵。你打算为每个 RGB 通道做一个 SVD 吗?换句话说,即使您形成一个 m x n x 3 数组,也不能只将其传递给 SVD 函数,因为 SVD 是为非任意大小张量的矩阵定义的。
标签: python arrays numpy linear-algebra