【问题标题】:Why do my numpy constructs ignore tuple deconstruction?为什么我的 numpy 构造忽略元组解构?
【发布时间】:2021-03-12 22:26:13
【问题描述】:

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

分配一些变量

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 很可能给切片赋值,语法见stackoverflow.com/questions/10923212/…
  • 此外,在此方法中仅交换行会产生相同的错误结果
  • 没错,一次一片

标签: python numpy tuples iterable-unpacking


【解决方案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 切片将仅提供引用而不是 在创建右侧元组时提供副本。当第二次赋值生效时,a的底层存储已经被修改了。

https://numpy.org/doc/stable/reference/arrays.indexing.html#basic-slicing-and-indexing

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

【讨论】:

  • 正是我需要的答案,我不知道 np 做了参考,解释了我见过的其他一些意外行为
  • 很高兴它有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 2023-02-15
  • 2015-07-08
  • 2020-04-11
  • 1970-01-01
相关资源
最近更新 更多