标题说的差不多。我已经阅读了文档并且已经使用该函数一段时间了,但我无法辨别这种转换的物理表现是什么。
原文由 austinkjensen 发布,翻译遵循 CC BY-SA 4.0 许可协议
标题说的差不多。我已经阅读了文档并且已经使用该函数一段时间了,但我无法辨别这种转换的物理表现是什么。
原文由 austinkjensen 发布,翻译遵循 CC BY-SA 4.0 许可协议
我们将从文档中的示例开始。
>>> np.unravel_index([22, 41, 37], (7,6))
(array([3, 6, 6]), array([4, 5, 1]))
首先, (7,6)
指定我们想要将索引转换回的目标数组的维度。其次, [22, 41, 37]
是这个数组上的一些索引, 如果数组被展平的话。 如果一个 7 x 6 的数组被展平,它的索引看起来像
[ 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*]
如果我们将这些索引展开到它们在暗淡的 (7, 6)
数组中的原始位置,它将是
[[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, *22*, 23], <- (3, 4)
[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35],
[36, *37*, 38, 39, 40, *41*]]
(6, 1) (6,5)
unravel_index
函数的返回值告诉您如果数组未展平 ,[22, 41, 37] 的索引应该是什么。如果数组未展平,这些索引应该是 [(3, 4), (6, 5), (6,1)]
。换句话说,该函数将展平数组中的索引传输回其未展平的版本。
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.unravel_index.html
原文由 Tai 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
1 回答2.5k 阅读✓ 已解决
2 回答884 阅读✓ 已解决
计算机内存是线性寻址的。每个存储单元对应一个数字。一个内存块可以根据基址(它的第一个元素的内存地址)和项目索引来寻址。例如,假设基地址为 10,000:
要存储多维块,必须以某种方式使它们的几何形状适合线性内存。在
C
和NumPy
中,这是逐行完成的。一个二维示例是:因此,例如,在这个 3×4 块中,二维索引
(1, 2)
将对应于线性索引6
即1 x 4 + 2
。unravel_index
相反。给定线性索引,它计算相应的ND
索引。因为这取决于块尺寸,所以这些也必须通过。因此,在我们的示例中,我们可以从线性索引 ---(1, 2)
6
:注意:以上内容掩盖了一些细节。 1) 将项目索引转换为内存地址还必须考虑项目大小。例如,一个整数通常有 4 或 8 个字节。因此,在后一种情况下,项目
i
的内存地址将为base + 8 x i
。 2). NumPy 比建议的要灵活一些。如果需要,它可以逐列组织ND
数据。它甚至可以处理内存中不连续的数据,例如留有间隙等。额外阅读: ndarray 的内存布局