Python - NumPy - кортежи как элементы массива

Я специализируюсь на компьютерных науках в университете и работаю над проектом программирования для моего курса Calc III, включающим разложение по сингулярным значениям. Идея состоит в том, чтобы преобразовать изображение размером mxn в матрицу mxn, в которой каждый элемент представляет собой кортеж, представляющий цветовые каналы (r, g, b) пикселя в точке (m, n). Я использую 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 в свою программу и изменить их соответствующим образом?

Заранее спасибо.

12
задан duffymo 20 November 2010 в 04:25
поделиться