python - Numpy:创建数组的任意视图
问题描述
为了表示数独网格,我有以下内容:
values = np.arange(81)
rows = values.reshape(9,9)
cols = rows.T
whererows
和cols
are views into ,允许我就地values
修改数组。values
随着单元格的索引values
和rows
可视化网格的视图,我有:
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
数组中维护一个索引列表以表示每个块并手动更新值,但为了提高效率,我试图避免这种情况。
有没有一种有效的方法来做到这一点?
解决方案
推荐阅读
- marklogic - MLCP 导出:是否可以更改由 mlcp 导出创建的 zip 文件的名称
- android - Kotlin:一次构建一个类并在任何地方访问它
- java - 如何使用 java 将 100 MB 文件上传到共享点?
- java - 如何使用 Selenium 和 Java 从网络选项卡中的 DOM 结构中捕获授权承载令牌
- c# - 如何彻底销毁arrayPool
- java - 获取位图变量的 URI
- rust - Rocket CORS 如何使用 Request Guard 返回字符串?
- algorithm - heapify(int rootIndex) 是否只为以输入 rootIndex 为根的堆构建堆?
- ios - iOS dylib:运行时未加载的lib崩溃-在自定义框架和xcode项目中使用相同的pod
- asp.net - 如何配置 Sagepay 的测试服务器,包括重定向 URI?