为什么我的 numpy 构造忽略元组解构?
Why do my numpy constructs ignore tuple deconstruction?
编辑:让我澄清一下原始 post
中的神秘变量
分配一些变量
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])
])
])
np.arrays是我的调试尝试之一。
接下来,我尝试通过元组解构来交换列、行等:
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 术语中的 'view')。如果强制复制,您可以获得预期的行为。
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 切片将仅提供引用而不是副本在创建右侧元组时。第二次赋值生效时,a
的底层存储已经被修改
https://numpy.org/doc/stable/reference/arrays.indexing.html#basic-slicing-and-indexing
一般来说,避免弄清楚 numpy 切片是否会自动成为副本。在逻辑上必要时复制一份。
编辑:让我澄清一下原始 post
中的神秘变量分配一些变量
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])
])
])
np.arrays是我的调试尝试之一。
接下来,我尝试通过元组解构来交换列、行等:
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 术语中的 'view')。如果强制复制,您可以获得预期的行为。
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 切片将仅提供引用而不是副本在创建右侧元组时。第二次赋值生效时,a
的底层存储已经被修改
https://numpy.org/doc/stable/reference/arrays.indexing.html#basic-slicing-and-indexing
一般来说,避免弄清楚 numpy 切片是否会自动成为副本。在逻辑上必要时复制一份。