我是大学的CS专业,主要从事计算三级计划编程项目,涉及奇异值分解。该想法基本上是将m×n维的图像转换为m×n矩阵,其中每个元素是代表点(m,n)处像素的颜色通道(r,g,b)的元组。我使用的是Python,因为它是迄今为止唯一真正教授的语言。Python - NumPy - 作为数组元素的元组
从我可以告诉,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×n×3的数组,你也不能将它传递给SVD函数,因为SVD是为矩阵而不是任意大小的张量定义的。 – 2010-11-20 07:07:39