Уведомления

Группа в Telegram: @pythonsu

#1 Март 25, 2017 21:44:03

Lork
Зарегистрирован: 2017-01-08
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка матриц. Непонятная ошибка.

Приветствую всех!
Изучаю обработку многомерных массивов. Задача - вставлена в код.

 '''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)???

Отредактировано Lork (Март 25, 2017 21:45:25)

Офлайн

#2 Март 25, 2017 22:36:09

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Обработка матриц. Непонятная ошибка.

 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)

Офлайн

#3 Март 25, 2017 23:04:06

Lork
Зарегистрирован: 2017-01-08
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка матриц. Непонятная ошибка.

Romissevd
Благодарю за ответ и подсказку, но до enumerate я пока ещё не дошёл, посему пытаюсь использовать простые методы. Вообще, в этом вопросе для меня важнее понять принцип работы for…in для многомерных массивов, а он почему-то
 a[j][i]
за список принимает, хотя я имел в виду обращение к элементу матрицы

Офлайн

#4 Март 26, 2017 00:19:07

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Обработка матриц. Непонятная ошибка.

 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

Отредактировано vic57 (Март 26, 2017 00:29:04)

Офлайн

#5 Март 26, 2017 00:36:00

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Обработка матриц. Непонятная ошибка.

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)



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Март 26, 2017 00:42:36)

Офлайн

#6 Март 26, 2017 00:37:17

Lork
Зарегистрирован: 2017-01-08
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка матриц. Непонятная ошибка.

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

Офлайн

#7 Март 26, 2017 00:41:42

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Обработка матриц. Непонятная ошибка.

Lork
Чего-то не пошло:
xrange это из второго пайтона, в третем его убрли, остался только range



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#8 Март 26, 2017 00:41:59

Lork
Зарегистрирован: 2017-01-08
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка матриц. Непонятная ошибка.

PEHDOM
Спасибо! Кажись, начал понимать где ноги растут
Пошёл разбираться.

Офлайн

#9 Март 27, 2017 01:09:55

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Обработка матриц. Непонятная ошибка.

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))])

Офлайн

#10 Март 27, 2017 20:49:32

Lork
Зарегистрирован: 2017-01-08
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка матриц. Непонятная ошибка.

scidam

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

P.S. В исходной задаче, в конце-концов, применил Scipy и транспонирование матрицы. После чего проход for..in'ом упростился до построчного. Изврат, конечно, зато работает.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version