Python numpy多维数组元素选择:解决[:][i][j]取值不符合预期问题
Numpy三维数组索引问题解答
正确实现代码
你需要的结果可以通过单括号+逗号分隔多维度索引实现:
A[:, 0, 0]
该写法会直接对三个维度分别做索引:
- 第0维(最外层)用
:选取所有元素 - 第1维(中间层)用
0选取每个子矩阵的第0行 - 第2维(最内层)用
0选取每行的第0个元素
最终返回的就是你需要的array([0.89565135, 0.70610822, 0.71822397])。
三种错误写法结果一致的原因
numpy中连续方括号A[x][y][z]是逐层递进索引,每一步都会返回一个新数组后再执行下一次索引,和单括号多维度索引逻辑完全不同,三种写法的执行过程分别如下:
A[:][0][0]:A[:]返回完整的原3维数组,和A完全等价- 接着
[0]取第0维的第0个元素,返回形状为(2,3)的二维数组:[[0.89565135 0.79502322 0.89015957],[0.40303084 0.80496231 0.50278239]] - 最后
[0]取该二维数组的第0行,得到长度为3的一维数组
A[0][:][0]:A[0]直接取第0维的第0个元素,返回上述形状为(2,3)的二维数组[:]返回该二维数组的完整内容,和原二维数组等价- 最后
[0]同样取该二维数组的第0行,结果和上一种写法完全相同
A[0][0][:]:A[0]取第0维第0个元素,得到形状(2,3)的二维数组[0]取该二维数组的第0行,得到长度为3的一维数组[:]返回该一维数组的完整内容,结果和前两种写法一致
补充说明:连续方括号索引本质是把上一步的返回值当做新数组做普通索引,无法实现跨维度的批量选取,处理多维数组时优先使用单括号逗号分隔的索引语法,避免逻辑错误。
内容的提问来源于stack exchange,提问作者J.A
相关产品推荐
相关产品推荐

