python - Numpy 数组多维索引与列表 IndexError : shape mismatch

标签 python numpy multidimensional-array

import numpy as np
a = np.zeros((10,20,30))

要提取第二维和第三维的元素,ind1和ind2是索引列表

ind1 = [0,5,6]
ind2 = [1,2,7,8]
a[:,ind1,ind2]

上面的命令给出了一个 IndexError:形状不匹配

如果我们按如下方式建立索引

a1 = a[:,ind1,:]
a2 = a1[:,:,ind2]

它有效,如果 ind1 和 ind2 的尺寸相同,则索引有效。

多维数组的索引列表是否必须具有相同的形状?

最佳答案

由于输出的形状由索引数组的形状决定,所以它们必须相同。

或者更确切地说兼容,以下

i1, i2 = np.ix_(ind1, ind2)
a[:, i1, i2]

会起作用的。它通过选取 ind1、ind2 的所有组合来生成一个 10x3x4 数组(i1、i2 的形状为 (3, 1) (1, 4),因此它们一起广播)。

相比之下,“正常”行为(当 ind1 和 ind2 不可广播时)只是选择 ind1 和 ind2 的相应元素,这就是为什么它们的形状必须一致。

这是一个更简单的示例来显示差异

>>> z = np.zeros((5,5), int)
>>> a = [1,2,4]
>>> z[a,a] = 1
>>> z # 3 points set
array([[0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1]])
>>> a1,a2 = np.ix_(a,a)
>>> z[a1,a2] = 1
>>> z # 3x3 points set
array([[0, 0, 0, 0, 0],
       [0, 1, 1, 0, 1],
       [0, 1, 1, 0, 1],
       [0, 0, 0, 0, 0],
       [0, 1, 1, 0, 1]])

关于python - Numpy 数组多维索引与列表 IndexError : shape mismatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42382992/

相关文章:

c++ - 查找多维数组的大小

php - array_multisort 具有多维对象数组

python - jinja 2 嵌套字典到 yaml

Python 独立应用程序在启动时失败 (macOS)

python - Numpy 始终将邻居获取为 3x3 矩阵

python - 将 numpy 3D 数组 reshape 为 2D

java - 在 java 中存储数据集,例如 python 的 dict

python - 尽管有 Nat 网关,但使用 Python 的 Lambda 函数请求仍超时

python - 如何在 Odoo 12 中直接访问看板 View 模板中的 python 方法?

python - 如何为 Pytables EArray 创建定义原子