在Python中为numpy数组命名切片

6

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

>>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中将新矩阵赋给另一个矩阵的已命名分片?


1
left_f = numpyp.rot90(left_f, k=3) 之后,cube[3:6,0:3] = left_f 怎么样?我认为你的代码已经足够符合 Python 风格了。当处理矩阵时,你必须使用许多索引。 - Eric Duminil
1
顺便问一下,cube 太大了吧?最后三行没有被使用。 - Eric Duminil
@eric-duminil 是的,那样做可以解决问题,但并不理想。假设我后来将 left_f 切片更改为矩阵的其他部分,比如 cube[3:6,1:4],那么我就必须在整个代码中寻找并替换那些部分。我希望将索引的显式使用降至最低。 - Harsh
1
你可能需要另一种数据结构。这个链接可能会对你有所帮助:https://dev59.com/kHRB5IYBdhLWcg3wz6ed。 - Eric Duminil
这个立方体故意多了三行,我实际上是用它来保留 back_f 的另一种表示,以便我可以轻松地滚动列来表示移动。我已经更改了问题中的矩阵以显示这一点。 - Harsh
谢谢。我会研究一下其他的数据结构。 - Harsh
1个回答

3
你可以将你的片段分配给一个变量:
left_face = slice(3, 6), slice(0, 3)
cube[left_face] = np.rot90(cube[left_face], k=3)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接