首页 > 解决方案 > Numpy:创建数组的任意视图

问题描述

为了表示数独网格,我有以下内容:

values = np.arange(81)
rows = values.reshape(9,9)
cols = rows.T

whererowscolsare views into ,允许我就地values修改数组。values

随着单元格的索引valuesrows可视化网格的视图,我有:

array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8],
       [ 9, 10, 11, 12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23, 24, 25, 26],
       [27, 28, 29, 30, 31, 32, 33, 34, 35],
       [36, 37, 38, 39, 40, 41, 42, 43, 44],
       [45, 46, 47, 48, 49, 50, 51, 52, 53],
       [54, 55, 56, 57, 58, 59, 60, 61, 62],
       [63, 64, 65, 66, 67, 68, 69, 70, 71],
       [72, 73, 74, 75, 76, 77, 78, 79, 80]])

除了对数据有一个rows和一个cols视图之外,我还需要一个blocks视图,其中一个块由网格上的 3x3 正方形定义。例如,块 0 包含单元格索引[0, 1, 2, 9, 10, 11, 18, 19, 20],而块 1 包含索引[3, 4, 5, 12, 13, 14, 21, 22, 23],依此类推。

我尝试过连接切片中的视图,例如:

block = values[0:3] + values[9:12] + values[18:21]

但是连接视图总是会产生副本。

进一步的努力是使用高级索引,但高级索引总是返回副本:

block = values[[0, 1, 2, 9, 10, 11, 18, 19, 20]]

最后,我尝试使用lib.stride_tricks.sliding_window_view(x, ...), 和lib.stride_tricks.as_strided(x, [, shape, ...]),但是对于我的生活来说,我无法找到一种方法来获得我需要的视图。此外,我看到了其他问题,并且文档提到任意视图具有只能查看连续内存区域的限制。

这是我的数独求解器的主要瓶颈,每次我想通过块接口更新值时,我都无法复制。我确实意识到一个解决方案是在values数组中维护一个索引列表以表示每个块并手动更新值,但为了提高效率,我试图避免这种情况。

有没有一种有效的方法来做到这一点?

标签: pythonnumpynumpy-ndarray

解决方案


推荐阅读