Замена строк массива numpy - PullRequest
1 голос
/ 16 марта 2020

Я пытаюсь эмулировать правило Крамера для неопределенного числа переменных. Это то, что у меня есть до сих пор

def cramers(n)
    matrix = []
    for i in range(0, n):
        matrix.append([])
        for j in range(0, n+1):
            matrix[i].append(0)
            matrix[i][j] = float(input("V" + str(i+1) + str(j+1) + ": "))
    #n = 2, V11 = 1, V12 = 2, V13 = 3, V21 = 4, V22 = 5, V23 = 6

    mat = np.array(matrix)
    matA = mat[0:n, 0:n]
    matB = mat[0:n, n:]

    matATrans = matA.transpose()
    matBTrans = matB.transpose()

для n = 2, это примерные входные значения matATrans и matBTrans:

matATrans = [[1. 4.], [2. 5.]]
matBTrans = [3. 6.]

Мой вопрос: как я могу получить numpy массив, например, с n = 2 длиной, значение которого содержит это?

mat = [[[3. 6.],[2. 5.]],[[1. 4.],[3. 6.]]]

По сути, (n-1) -й элемент matATrans заменяется на matBTrans. Я думаю, что это можно сделать, используя forl oop. Это была моя попытка.

for i in range(n):
    matATrans[i] = matBTrans
    print(matATrans)

Результат таков:

[3. 6.],[2. 5.]
[3. 6.],[3. 6.]

Очевидно, что это неправильно, потому что содержимое matATrans было изменено в первом l oop. Кроме того, он все еще не добавлен к матовой матрице.

Пожалуйста, просветите меня. Спасибо

1 Ответ

0 голосов
/ 16 марта 2020

В python, когда вы присваиваете список новой переменной, вы просто создаете другую ссылку на тот же объект, что является причиной текущего поведения. Один из способов исправить это - использовать метод copy и копировать матрицу A каждый l oop.

n = 2
matATrans = [[1, 4], [2, 5]]
matBTrans = [3, 6]

result = []
for i in range(n):
    temp = matATrans.copy()
    temp[i] = matBTrans
    result.append(temp)

print(result)
...