Python 为什么我的numpy构造忽略了元组解构?

Python 为什么我的numpy构造忽略了元组解构?,python,numpy,tuples,iterable-unpacking,Python,Numpy,Tuples,Iterable Unpacking,编辑:让我澄清一下原始帖子中的神秘变量 分配一些变量 WHITE = 0 #UP BLUE = 1 #DOWN ORANGE = 2 #LEFT GREEN = 3 #FRONT RED = 4 #RIGHT YELLOW = 5 #BACK 首先,我创建一个janky矩阵: cube = np.array([ np.array([ np.array([WHITE, WHITE, WHITE]),np.array([WHITE, WHITE, WHITE])

编辑:让我澄清一下原始帖子中的神秘变量

分配一些变量

WHITE = 0 #UP
BLUE = 1 #DOWN
ORANGE = 2 #LEFT
GREEN = 3 #FRONT
RED = 4 #RIGHT
YELLOW = 5 #BACK
首先,我创建一个janky矩阵:

cube = np.array([
        np.array([
          np.array([WHITE, WHITE, WHITE]),np.array([WHITE, WHITE, WHITE]), np.array([WHITE, WHITE, WHITE])
        ]),
        np.array([
         np.array([BLUE, BLUE, BLUE]), np.array([BLUE, BLUE, BLUE]), np.array([BLUE, BLUE, BLUE])
        ]),
        np.array([
         np.array([ORANGE, ORANGE, ORANGE]), np.array([ORANGE, ORANGE, ORANGE]), np.array([ORANGE, ORANGE, ORANGE])
        ]),
        np.array([
         np.array([GREEN, GREEN, GREEN]), np.array([GREEN, GREEN, GREEN]), np.array([GREEN, GREEN, GREEN])
        ]),
        np.array([
         np.array([RED, RED, RED]), np.array([RED, RED, RED]), np.array([RED, RED, RED])
        ]),
        np.array([
         np.array([YELLOW, YELLOW, YELLOW]), np.array([YELLOW, YELLOW, YELLOW]), np.array([YELLOW, YELLOW, YELLOW])
        ])
      ])
数组是我调试的尝试之一

接下来,我尝试使用元组解构交换列、行等:

rubiks[LEFT][:,2], rubiks[DOWN][0] = rubiks[DOWN][0], rubiks[LEFT][:,2]
结果就好像它是迭代应用的:

[[1 1 1]
  [1 1 1]
  [1 1 1]]

 [[2 2 1]
  [2 2 1]
  [2 2 1]]
应该是:

[[2 2 2]
  [1 1 1]
  [1 1 1]]

 [[2 2 1]
  [2 2 1]
  [2 2 1]]

我想我误解了什么,但这不应该像预期的那样交换值吗?

右侧的切片生成引用(或numpy术语中的“视图”)。如果强制复制,则可以获得预期的行为

import numpy as np
a = np.array([1, 2])
a[:1], a[1:] = a[1:], a[:1]
print(a) # [2 2]

import numpy as np
a = np.array([1, 2])
a[:1], a[1:] = a[1:].copy(), a[:1].copy()
print(a) # [2 1]
多变量赋值本质上是元组打包和解包。赋值表达式右侧的Numpy slice仅在创建右侧元组时提供引用而不是副本。当第二个赋值生效时,
a
的底层存储已被修改


通常,避免弄清楚numpy切片是否会自动成为副本。在逻辑上需要时复制一份。

其中有很多未定义的变量,但如果您试图为切片赋值,我认为您只需一次一个,使用numpy为切片赋值是非常有可能的,请参阅,在这种方法中只交换行会产生相同的错误结果实际上,一次一个切片正好是我需要的答案,我不知道np确实引用了,解释了我看到的一些其他意外行为(它有帮助:)