gpt4 book ai didi

python - 沿特定维度从 ndarray 中减去矩阵而不重新整形

转载 作者:行者123 更新时间:2023-12-01 01:32:47 25 4
gpt4 key购买 nike

假设我有一个名为 ahat 的 2 x 2 x 100 ndarray 和一个名为 A 的 2 x 2 矩阵。在不循环或 reshape 的情况下,沿着大小为 100 的维度减去 2 x 2 矩阵的最 Pythonic 方法是什么?

for k in range(ahat.shape[2]):
ahat[:,:,k] = ahat[:,:, k] - A

我尝试使用np.apply_over_axes但无法让它工作。更一般地说,如果我有两个兼容形状的 ndarray,如上例所示,那么沿特定维度操作的首选方式是什么。例如,我可能想要将 ahat 中的每个 2x2 矩阵与 A 相乘,或者我可能想要沿维度应用 np.linalg.inv大小为 100。

最佳答案

A 提升为形状 (2,2,1) 的数组,然后 NumPy broadcasting将完成剩下的工作:

ahat -= A[..., None]

A[..., None] 相当于 A[..., np.newaxis]。它将长度为 1 的新轴添加到数组中。由于 ahat 的形状为 (2,2,100),而 A[..., None] 的形状为 (2,2,1),NumPy 广播会将两个数组提升为兼容的形状 (2,2,100)(但以内存有效的方式,没有实际将值从 A 复制到更大的数组)。

更一般地说,请注意 NumPy 广播会自动将新轴添加到任何 NumPy 数组形状的左侧。因此,例如,对于任何基本的 NumPy 算术运算(例如加法或乘法),如果算术运算中涉及的另一个数组是 3,A 会自动广播为 (1,2,2) 之类的形状- 维,(如果另一个数组是 4 维的话,甚至是 (1,1,2,2))。上面,我们需要 A[..., None] 来显式添加新轴,因为我们希望新轴位于形状的右侧。

<小时/>

对于矩阵乘法,您通常会使用 np.dotnp.einsumnp.tensordot。其中一些函数,例如 np.einsum 和 np.tensordot 允许您指定希望在矩阵乘法中使用的轴(因此您不需要添加新的轴)明确的轴)。例如,要进行矩阵乘法 ahatA,您可以使用

np.tensordot(ahat, A, axes=[[1], [0]])

np.einsum('ijk,jl->ikl', ahat, A)

这会将 ahat 沿 1 轴的值与 A 沿 0 轴的值相乘,然后求和。

关于python - 沿特定维度从 ndarray 中减去矩阵而不重新整形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52680096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com