NumPy三维数组索引取值及ravel展平顺序相关疑问
NumPy数组索引与存储顺序的常见误区解释
1. 三维数组的索引顺序误区
你定义的数组B = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])是形状为(2,2,2)的3维数组,NumPy的索引规则是从左到右对应最外层维度到最内层维度,三个维度的含义分别为:
- 第0维(最外层):对应你说的「页」,共2页,索引0对应
[[1, 2], [3, 4]],索引1对应[[5, 6], [7, 8]] - 第1维(中间层):对应每页内的行,每页共2行,以第0页为例,索引0对应
[1, 2],索引1对应[3, 4] - 第2维(最内层):对应每行内的列,每行共2列,以第0页第1行的
[3,4]为例,索引0对应3,索引1对应4
所以B[0,1,0]的取值逻辑是「第0页、第1行、第0列」,返回值为3。你之前的误区是把索引顺序搞反了,误将最内层的列维度当成了第一个索引位,才会预期得到2。
2. 行优先(C顺序)的维度变化顺序误区
NumPy默认的行优先(C风格)存储规则是:最内层的维度变化最快,最外层的维度变化最慢,和你以为的「最外层页变化最快」刚好相反。
所以np.ravel(B)默认按行优先展开时,会先遍历完最内层的列,再遍历中间层的行,最后才遍历最外层的页:先把第0页的所有元素按行遍历得到1 2 3 4,再遍历第1页的所有元素得到5 6 7 8,最终合并结果就是你实际看到的输出。
如果你想要得到预期的1 5 2 6 3 7 4 8的输出,需要使用列优先(Fortran风格)的展开规则,调用np.ravel(B, order='F')即可,列优先的规则是最外层维度变化最快,刚好符合你之前的预期。
内容的提问来源于stack exchange,提问作者Nukesub
相关产品推荐
相关产品推荐

