我是大学计算机科学专业的学生,正在为我的Calc III课程做一个涉及奇异值分解的编程项目。其思想基本上是将m×n维的图像转换成m×n矩阵,其中每个元素是表示点(m,n)处的像素的颜色通道(r,g,b)的元组。我之所以使用Python,是因为到目前为止,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函数复制到我自己的程序中,并相应地修改它们?
提前谢谢。
发布于 2010-11-20 16:25:02
您应该将数组元素类型设置为元组,而不是将其设置为'O‘(对象)。有关示例,请参阅the SciPy manual。
在您的示例中,最简单的方法是使用类似于
a = zeros((ph,pw), dtype=(float,3))假设您的RGB值是3个浮点数的元组。
当然,奇异值分解是针对2维矩阵而不是3维数组定义的,因此您不能使用linalg.svd(a)。你必须决定你需要什么矩阵的奇异值分解(三个可能的矩阵:R,G和B)。
例如,如果您想要计算"R“矩阵的奇异值分解(假设它是元组的第一个元素),请使用如下内容:
linalg.svd(a[:,:,1])发布于 2010-11-20 12:53:59
我想你需要一个ph by pw by 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个元素的列表,而不是元组。
https://stackoverflow.com/questions/4231190
复制相似问题