【问题标题】:Naming slices of numpy arrays in Python在 Python 中命名 numpy 数组的切片
【发布时间】:2017-03-11 12:23:18
【问题描述】:

我有一个大矩阵,它代表.. 比如说一个魔方。

>>cube

>>[[-1, -1, -1,  1,  2,  3, -1, -1, -1, -1, -1, -1],
   [-1, -1, -1,  4,  5,  6, -1, -1, -1, -1, -1, -1],
   [-1, -1, -1,  7,  8,  9, -1, -1, -1, -1, -1, -1],
   [ 1,  2,  3,  4,  5,  6,  7,  8,  9,  8,  1,  8],
   [ 4,  5,  6,  0,  7,  7,  6,  9,  6,  8,  1,  0],
   [ 7,  8,  9,  6,  9,  7,  6,  6,  9,  0,  1,  7],
   [-1, -1, -1,  1,  1,  0, -1, -1, -1, -1, -1, -1],
   [-1, -1, -1,  8,  8,  1, -1, -1, -1, -1, -1, -1],
   [-1, -1, -1,  8,  0,  1, -1, -1, -1, -1, -1, -1],
   [-1, -1, -1,  7,  1,  0, -1, -1, -1, -1, -1, -1],
   [-1, -1, -1,  0,  1,  8, -1, -1, -1, -1, -1, -1],
   [-1, -1, -1,  8,  1,  8, -1, -1, -1, -1, -1, -1]])

我已将其切成代表面孔的部分。

top_f   = cube[0:3,3:6]
botm_f  = cube[6:9,3:6]

back_f  = cube[3:6,9:12]
front_f = cube[3:6,3:6]
left_f  = cube[3:6,0:3]
right_f = cube[3:6,6:9]

我现在想为左脸分配一个修改后的矩阵。

left_f = numpyp.rot90(left_f, k=3)

但这不会改变父矩阵cube 中的值。 我知道这是因为新生成的矩阵被分配给变量left_f,因此对子切片cube[3:6,0:3] 的引用丢失了。

我可以直接更换它。

cube[3:6,0:3] = numpyp.rot90(left_f, k=3)

但这不是很可读。 如何以 Python 方式将新矩阵分配给另一个矩阵的命名切片?

【问题讨论】:

  • cube[3:6,0:3] = left_fleft_f = numpyp.rot90(left_f, k=3) 之后呢?我会说你的代码足够pythonic。使用矩阵时,您必须使用许多索引。
  • 顺便说一句,cube 是不是太大了?最后 3 行未使用。
  • @eric-duminil 是的,这可以解决问题,但并不理想。假设稍后我将 left_f 切片更改为矩阵的其他部分,例如 cube[3:6,1:4],那么我将不得不在整个代码中寻找来替换这些部分。我希望尽量减少对索引的显式使用。
  • 您可能需要另一个数据结构。 This 可能会对您有所帮助。
  • 立方体故意大了三行,我实际上是用它来保留 back_f 的另一个表示,以便我可以轻松滚动表示移动的列。我已经更改了问题中的矩阵以显示这一点。

标签: python numpy


【解决方案1】:

您可以将切片分配给变量:

left_face = slice(3, 6), slice(0, 3)
cube[left_face] = np.rot90(cube[left_face], k=3)

【讨论】:

    猜你喜欢
    • 2020-12-11
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2019-07-11
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多