Найти - Пользователи
Полная версия: Обработка матриц. Непонятная ошибка.
Начало » Python для новичков » Обработка матриц. Непонятная ошибка.
1
Lork
Приветствую всех!
Изучаю обработку многомерных массивов. Задача - вставлена в код.
 '''1. Выполнить обработку элементов прямоугольной матрицы A, имеющей N
строк и M столбцов. Найти наибольший элемент столбца матрицы A, для
которого сумма абсолютных значений элементов максимальна.
'''
import math
a = [[48, 16, 33, -8, 22, -23, 25, 39, 6], 
     [-11, 13, -9, -44, 34, -6, -6, -4, 19], 
     [-26, -33, 7, -18, -5, -25, 13, 0, 14], 
     [-50, 8, -23, 43, -11, 7, 50, 44, 28], 
     [-10, -43, 13, -48, 13, 18, 7, -49, -18], 
     [-29, -8, 31, -43, -27, 22, 37, 21, -36], 
     [1, 35, -38, 34, -5, -35, 47, 13, 7]]
'Находим суммы столбцов (в виде списка "c")'
c=[]
for j in a:
    b=0
    for i in a:
        b=b+math.fabs(a[j][i])
    c.append(b)
print(c)
'Далее - идет последующая обработка массива (матрицы)...'

При запуске - выдаёт ошибку:
 b=b+math.fabs(a[j][i])
TypeError: list indices must be integers, not list

Объясните, пжлст, неразумному, где он там список-то увидел (…be integers, not list)???
Romissevd
 import math
a = [[48, 16, 33, -8, 22, -23, 25, 39, 6],
     [-11, 13, -9, -44, 34, -6, -6, -4, 19],
     [-26, -33, 7, -18, -5, -25, 13, 0, 14],
     [-50, 8, -23, 43, -11, 7, 50, 44, 28],
     [-10, -43, 13, -48, 13, 18, 7, -49, -18],
     [-29, -8, 31, -43, -27, 22, 37, 21, -36],
     [1, 35, -38, 34, -5, -35, 47, 13, 7]]
'Находим суммы столбцов (в виде списка "c")'
c=[]
for num, j in enumerate(a[0]):
    b=0
    for i in a:
        b=b+math.fabs(i[num])
    c.append(b)
print(c)
Lork
Romissevd
Благодарю за ответ и подсказку, но до enumerate я пока ещё не дошёл, посему пытаюсь использовать простые методы. Вообще, в этом вопросе для меня важнее понять принцип работы for…in для многомерных массивов, а он почему-то
 a[j][i]
за список принимает, хотя я имел в виду обращение к элементу матрицы
vic57
 a = [[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]
size = len(a[0])
c = [0 for _ in xrange(size)]
for i in a:
    for j in xrange(size):
        c[j] += i[j]
print(c)
за список принимает, хотя я имел в виду обращение к элементу матрицы
не так
 >>> l = [11,12,33]
>>> for i in l: print i
11
12
33
>>> for i in l: print i,l[i]
11
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    for i in l: print i,l[i]
IndexError: list index out of range
PEHDOM
Lork
за список принимает, хотя я имел в виду обращение к элементу матрицы
а с чего вы взяли что что i и j это будут индексы?
Матрица у вас что? Список каждый элемент которого тоже список. Соответвенно когда вы делаете
for j in a: то фор возвращает вам элементы вашей “матрицы” а не индексы как вы думаете. А элемент вашего списка это список, например первый(нулевой) -
  [48, 16, 33, -8, 22, -23, 25, 39, 6]
. А вы пытаетесь этот список подставить как индекс.
Если чисто для обучения чтоб понять как оно работает длайте два цикла:

  import math
a = [[48, 16, 33, -8, 22, -23, 25, 39, 6],
     [-11, 13, -9, -44, 34, -6, -6, -4, 19],
     [-26, -33, 7, -18, -5, -25, 13, 0, 14],
     [-50, 8, -23, 43, -11, 7, 50, 44, 28],
     [-10, -43, 13, -48, 13, 18, 7, -49, -18],
     [-29, -8, 31, -43, -27, 22, 37, 21, -36],
     [1, 35, -38, 34, -5, -35, 47, 13, 7]]
'Находим суммы столбцов (в виде списка "c")'
c=[]
for j in a: # тут мы получаем  списки из которых состоит ваш список. Например для первого прохода это будет [48, 16, 33, -8, 22, -23, 25, 39, 6]
    b=0
    for i in j:  # а тут уже непосредственно проходимся по элементам вложеного списка 48, 16, ... и тд. опять же i это не индекс, это сам жлемент.
        b=b+math.fabs(i) 
    c.append(b)
print(c)
ечли нужно получать доступ именно по индексам то код будет выглядеть так.
 import math
a = [[48, 16, 33, -8, 22, -23, 25, 39, 6],
     [-11, 13, -9, -44, 34, -6, -6, -4, 19],
     [-26, -33, 7, -18, -5, -25, 13, 0, 14],
     [-50, 8, -23, 43, -11, 7, 50, 44, 28],
     [-10, -43, 13, -48, 13, 18, 7, -49, -18],
     [-29, -8, 31, -43, -27, 22, 37, 21, -36],
     [1, 35, -38, 34, -5, -35, 47, 13, 7]]
'Находим суммы столбцов (в виде списка "c")'
c=[]
for j in range(len(a)): #len(a) это длинна нашего списка спиков, считайте это к-во рядов.
    b=0
    for i in range(len(a[j])): #len(a[j]) это длинна уже вложеного спика, считайте к-во столбцов.
        b=b + math.fabs(a[j][i])
    c.append(b)
print(c)

Lork
vic57
a = [,
,
]
size = len(a)
c =
for i in a:
for j in xrange(size):
c += i
print©


Чего-то не пошло:
 c = [0 for _ in xrange(size)]
NameError: name 'xrange' is not defined
PEHDOM
Lork
Чего-то не пошло:
xrange это из второго пайтона, в третем его убрли, остался только range
Lork
PEHDOM
Спасибо! Кажись, начал понимать где ноги растут
Пошёл разбираться.
scidam
Lork
Изучаю обработку многомерных массивов
В реальных вычислительных задачах представление матриц в виде вложенных списков и последующие операции над ними с помощью циклов приводит к очень медленным вычислениям. В этом случае для работы рекомендуется пакет NumPy.
В NumPy решение вашей задачи было бы следующее:

 import numpy as np
# a = [ [....], [....]]  # matrix `a`
a = np.array(a)
answer = np.max(a[:, np.argmax(np.sum(np.abs(a), axis=0))])
Lork
scidam

Спасибо! Как дойду до детального изучения Numpy, буду разбирать этот пример “до костей”.

P.S. В исходной задаче, в конце-концов, применил Scipy и транспонирование матрицы. После чего проход for..in'ом упростился до построчного. Изврат, конечно, зато работает.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB