为什么两个数组中的值没有改变?做冷杉就行了

2024-09-30 03:25:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个9x9x9的三维数组,它是27个3x3x3的立方体。在确定了两个3x3x3的“立方体”和“id's”从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

Tags: idinputdefnpintfirstentermat
1条回答
网友
1楼 · 发布于 2024-09-30 03:25:15

原因如下:

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也会改变

稍后,将mattempB部分指定给它:

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

相关问题 更多 >

    热门问题