为了账号安全,请及时绑定邮箱和手机立即绑定

如何沿着多维数组的关联索引将向量元素添加到子数组的每个元素

如何沿着多维数组的关联索引将向量元素添加到子数组的每个元素

ABOUTYOU 2023-10-18 16:09:09
我想知道是否有一种更“numpythonic”或更有效的方法来执行以下操作:假设我有一个A已知长度的一维数组L,并且有一个多维数组B,它的维度也有长度L。假设我想添加(或设置) 的值B[:, ..., x, ..., :] += A[x]。换句话说,将该值添加到匹配索引 中A[x]的整个子数组的每个值。Bx一个非常简单的工作示例是这样的:A = np.arange(10, 20)B = np.random.rand(3, len(A), 3)for iii in range(len(A)):    B[:, iii, :] += A[iii]显然,我总是可以像上面那样循环遍历我想要的索引,但我很好奇是否有更有效的方法。如果有一些更常见的术语来描述这个过程,我也会感兴趣,因为我什至很难构建适当的谷歌搜索。我还试图避免创建与 -vector 形状相同的新数组,B并在其他索引上重复平铺A-vector ,然后将其添加到B,因为更“真实”的世界应用程序可能涉及B相对较大的数组。
查看完整描述

1 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

对于您的简单情况,您可以这样做:

B[:] = A[:, None]

这是因为广播才有效。B通过模拟in的尺寸A,您可以明确告诉 numpy 将元素放置在哪里。对于更一般的情况,您想要沿着的A维度放置,您可以执行以下操作:kB

B[:] = np.expand_dims(A, tuple(range(A.ndim, A.ndim + B.ndim - k)))

np.expand_dims将在您告诉它的索引处添加轴。还有其他方法。例如,您可以A使用B.ndim - k - 1以下实例建立索引None

B[:] = A[(slice(None), *(None,) * (B.ndim - k - 1))]

您还可以使用np.reshape来获取正确形状的视图:

B[:] = A.reshape(-1, *np.ones(B.ndim - k - 1, dtype=int))

或者

B[:] = A.reshape(-1, *(1,) * (B.ndim - k - 1))

或者

B[:] = A.reshape((-1,) + (1,) * (B.ndim - k - 1))

在所有这些情况下,您只需要扩展 的尾随维度A,因为这就是广播的工作原理。由于广播是 numpy 不可或缺的一部分,因此您只需替换即可=获得+=预期结果。


查看完整回答
反对 回复 2023-10-18
  • 1 回答
  • 0 关注
  • 55 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信