Странная индексация с двумерными массивами - PullRequest
0 голосов
/ 30 сентября 2018
def matrix_multiply(arr0, arr1):
    finalrow = len(arr0)
    finalcolumn = len(arr1[0])
    final = [[None]*finalcolumn] *finalrow
    print (final)
    for j in range(len(arr0)):
        for k in range(len(arr0)):
            summ = 0
            for i in range(len(arr0[0])):
                print ("i:", i, "j:",j,"k:",k)
                summ += arr0[j][i] * arr1[i][k]
            print (summ)
            print ("j:", j ,"k:",k)
            final[j][k] = summ
            print (final)
    return final

Итак, я создаю базовую функцию для класса, чтобы умножить 2 матрицы, и кажется, что мой вышеупомянутый алгоритм должен работать, но у меня странные проблемы с индексацией.

arr2 = [[1, 2, 3], [4, 5, 6]]
arr3 = [[1, 2], [2, 4], [5, 8]]
matrix_multiply(arr2, arr3)

[[None, None], [None, None]]
i: 0 j: 0 k: 0
i: 1 j: 0 k: 0
i: 2 j: 0 k: 0
20
j: 0 k: 0
[[20, None], [20, None]]
i: 0 j: 0 k: 1
i: 1 j: 0 k: 1
i: 2 j: 0 k: 1
34
j: 0 k: 1
[[20, 34], [20, 34]]
i: 0 j: 1 k: 0
i: 1 j: 1 k: 0
i: 2 j: 1 k: 0
44
j: 1 k: 0
[[44, 34], [44, 34]]
i: 0 j: 1 k: 1
i: 1 j: 1 k: 1
i: 2 j: 1 k: 1
76
j: 1 k: 1
[[44, 76], [44, 76]]
[[44, 76], [44, 76]]

Если я использую3 примера строки кода для вызова моей функции я получаю этот вывод.Я не понимаю, почему каждый раз, когда я делаю final [i] [j], он помещает число в 2 места в массиве.Может кто-нибудь объяснить, что я делаю не так?

1 Ответ

0 голосов
/ 30 сентября 2018

Одной из первых ошибок перед большой является ваши диапазоны, подумайте, что вы хотели сделать:

for i in range( len( final ) ):
    for j in range( len( final[0] ):

Часто ожидается, что строки с индексами i и столбцы с j.

Для двойной ошибки записи это происходит из-за

final = [ [ None ] *  finalRow ] * finalColumn

, и это не копирует ваш список [Нет, Нет, .., Нет], означающий: все они имеют одинаковую ссылку в памяти, т.е. когда выизмените первый, который вы измените другие, как мы говорим о тех же списках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...