我是大学的CS专业,主修我的Calc III课程的编程项目涉及奇异值分解。该想法基本上是将m×n维的图像转换为m×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函数复制到我自己的程序中,并相应地修改它们?
提前致谢。
答案 0 :(得分:14)
不应将数组元素类型设置为“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])
答案 1 :(得分:3)
我想你需要ph
pw
3
个numpy数组。
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元素列表而不是元组。