Почему изменение значений не производится в двух массивах? просто сделай первый - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть трехмерный массив размером 9x9x9, который рассматривается как 27 кубов размером 3x3x3. После идентификации двух «кубиков» 3x3x3 с «id» от 0 до 26 я хочу изменить значения двух «кубов». Когда я это делаю, я изменяю только значения первого куба (только первая строка)

Почему Python не делает второе изменение?

mat = np.arange(729).reshape(9,9,9)

idO = int(input('Enter first id \n'))
idD = int(input('Enter second id \n'))


def limites(id):
    x=id%3
    y=(id%9)//3
    z=id//9

    limites = np.array([z,y,x])
    return limites

def mover(limitesA, limitesB):
    tempA = mat[limitesA[0]*3:(limitesA[0]*3)+3, limitesA[1]*3:(limitesA[1]*3)+3, limitesA[2]*3:(limitesA[2]*3)+3]
    print(tempA)
    tempB = mat[limitesB[0]*3:(limitesB[0]*3)+3, limitesB[1]*3:(limitesB[1]*3)+3, limitesB[2]*3:(limitesB[2]*3)+3]
    print(tempB)
    # only the first line does
    mat[limitesB[0]*3:(limitesB[0]*3)+3, limitesB[1]*3:(limitesB[1]*3)+3, limitesB[2]*3:(limitesB[2]*3)+3] = tempA
    mat[limitesA[0]*3:(limitesA[0]*3)+3, limitesA[1]*3:(limitesA[1]*3)+3, limitesA[2]*3:(limitesA[2]*3)+3] = tempB     

limA=limites(idO)
limB=limites(idD)

mover(limA, limB)

Я ожидаю, что на выходе изменится два куба

mat[limitesB[0]*3:(limitesB[0]*3)+3, limitesB[1]*3:(limitesB[1]*3)+3, limitesB[2]*3:(limitesB[2]*3)+3] = tempA
mat[limitesA[0]*3:(limitesA[0]*3)+3, limitesA[1]*3:(limitesA[1]*3)+3, limitesA[2]*3:(limitesA[2]*3)+3] = tempB

но фактический выходной сигнал меняется только на первый куб

mat[limitesB[0]*3:(limitesB[0]*3)+3, limitesB[1]*3:(limitesB[1]*3)+3, limitesB[2]*3:(limitesB[2]*3)+3] = tempA

1 Ответ

0 голосов
/ 25 апреля 2019

Причина в следующей строке:

tempB = mat[limitesB[0]*3:(limitesB[0]*3)+3, limitesB[1]*3:(limitesB[1]*3)+3, limitesB[2]*3:(limitesB[2]*3)+3]

Создает представление , что означает, что если mat изменится, то будет tempB.

Позже вы присваиваете часть mat, из которой вырезана tempB:

mat[limitesB[0]*3:(limitesB[0]*3)+3, limitesB[1]*3:(limitesB[1]*3)+3, limitesB[2]*3:(limitesB[2]*3)+3] = tempA

Следовательно, следующие два эквивалента:

mat[limitesA[0]*3:(limitesA[0]*3)+3, limitesA[1]*3:(limitesA[1]*3)+3, limitesA[2]*3:(limitesA[2]*3)+3] = tempB

mat[limitesA[0]*3:(limitesA[0]*3)+3, limitesA[1]*3:(limitesA[1]*3)+3, limitesA[2]*3:(limitesA[2]*3)+3] = tempA

Чтобы это исправить,сделать копию:

tempB = mat[limitesB[0]*3:(limitesB[0]*3)+3, limitesB[1]*3:(limitesB[1]*3)+3, limitesB[2]*3:(limitesB[2]*3)+3].copy()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...