【问题标题】:Indexing error: shape mismatch: indexing arrays could not be broadcast together with shapes索引错误:形状不匹配:索引数组无法与形状一起广播
【发布时间】:2019-12-10 16:25:38
【问题描述】:

我正在尝试从张量中提取某些数据,但出现了奇怪的错误。在这里,我将尝试生成错误:

a=np.random.randn(5, 10, 5, 5)
a[:, [1, 6], np.triu_indices(5, 0)[0], np.triu_indices(5, 0)[1]].shape

我收到此错误

形状不匹配:索引数组无法与形状一起广播

我什至不做任何广播!都是切片。

我想要什么?将第零轴保持原样(获取所有内容),从第一个轴获取 [1] 和 [6],仅通过取上三角形元素将最后两个轴从 [5, 5] 重塑为 [15]。

【问题讨论】:

  • 只有第一个索引是切片,其余是数组,一起广播以创建 3 维的复合索引。
  • 那么预期的结果形状是什么,(5,2,15)?
  • @hpaulj 没错!那是所需的形状。我设法得到它,但分两个阶段。我没能做到一行
  • 显示 2 个步骤。它可能更简单。请参阅stackoverflow.com/q/57273662/901925 及其副本。
  • @hpaulj 第一步:tmp = a[:, :, np.triu_indices(5, 0)[0], np.triu_indices(5, 0)[1]] 第二步:a= tmp[:, [1, 6], ...] 所以基本上我避免了混合索引

标签: python numpy indexing


【解决方案1】:

我们需要将第二个轴索引数组扩展到2D,以便它形成一个外平面 反对np.triu_indices 之外的索引。因此,它为我们提供了mxn 数组的2D 网格,其中m 是第二个轴索引数组的长度,n 是np.triu_indices 的长度。所以,本质上,整个解决方案会简化成这样 -

r,c = np.triu_indices(5, 0)
out = a[:, np.array([1, 6])[:,None], r, c]

或者将该扩展版本作为列表提供,即 -

out = a[:, [[1],[6]], r, c]

我们还可以使用基于掩码的np.tri/np.triu,这在更大的数组上可能会更快,因为我们会跳过创建所有整数索引,就像这样 -

mask = ~np.tri(5, k=-1, dtype=bool)
out = a[:, np.array([1, 6])[:,None], mask]

【讨论】:

  • 我正在努力理解这一点!所以问题是混合索引方法。如果我分两步做,它会起作用。第一步:处理最后两个轴,得到一个新矩阵,第二步:用 a[:, [1, 6], ...] 简单地处理第 1 个轴你能扩展什么是外平面吗?
  • @Alex 把它们想象成两个相对于彼此“外部”的向量(以矩阵表示法)。所以,np.array([1, 6])[:,None] 是列向量,r,c 是行向量。因此,当一起操作时,它们形成了一个外部操作,迫使 numpy-broadcasting 提取 2D 块。您必须阅读 numpy.ix_ 和 numpy-broadcasting 文档和 stackoverflow.com/a/35608029 了解更多信息。
猜你喜欢
  • 2018-02-17
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多