【问题标题】:Broadcasting - 3D field of coefficients to 3D field of matrices given matrix basis广播 - 给定矩阵基础的 3D 系数场到矩阵的 3D 场
【发布时间】:2018-06-26 04:33:17
【问题描述】:

我有一个(大)4D 数组,由矩阵字段的给定基础中的 5 个系数组成。给定 5 个基矩阵,我想有效地计算矩阵字段。

系数字段c[x,y,z,i]是第i个系数在位置x,y,z的值

矩阵字段M[x,y,z,a,b](3,3)位置x,y,z的矩阵

基矩阵T_1,...T_5,即(3,3)基矩阵

我可以遍历空间中的每个位置:

M[x,y,z,:,:] = T_1[:,:]*c[x,y,z,0] + T_2[:,:]*c[x,y,z,1]...T_5[:,:]*c[x,y,z,4]

但这是非常低效的。我尝试使用 np.multiply,np.sum 会导致广播错误,因为所需的产品是 3x3 矩阵的字段。

【问题讨论】:

  • 所以在你的文字中你提到M[x,y,z,a,b],然后当你计算它时M[x,y,z] 哪个是维度?你能提供一个虚拟的例子吗?
  • 快速评论,np.apply_along_axis() 似乎是提供系数时的解决方案-->矩阵转换函数。
  • 这是附加问题的一种非常低效的方法,因为您没有任何用张量无法完成的繁重功能。查看einsum,可以将T_i打包成一个矩阵,然后使用张量表示法:docs.scipy.org/doc/numpy-1.14.0/reference/generated/…

标签: python numpy matrix


【解决方案1】:

请记住,对于numpy,这些 4 维和 5 维数组只是这样,而不是包含 2 维矩阵等的 3 维数组。

让我们尝试以一种明确维度的方式编写您的计算:

M[x,y,z] = T_1*c[x,y,z,0] + T_2*c[x,y,z,1]...T_5*c[x,y,z,4]

M[x,y,z,:,:] = T_1[:,:]*c[x,y,z,0] + T_2[:,:]*c[x,y,z,1]...T_5[:,:]*c[x,y,z,4]

c[x,y,z,i] 是一个系数,对吧?那么MT_n 数组的加权和?

一种表达方式是:

T = np.stack([T_1, T_2, ...T_5], axis=0)   # 3d  (nab)
M = np.einsum('nab,xyzn->xyzab', T, c)

我们也可以在新的最后一个轴上堆叠T_i

T = np.stack([T_1, T_2 ...T_5], axis=2)   # (abn)
M = np.einsum('abn,xyzn->xyzab', T, c)

或广播乘法加和:

M = (T[None,None,None,:,:,:] * c[:,:,:,None,None,:]).sum(axis=-1)

我在写这段代码没有测试,所以可能会有错误,但我认为基本的大纲是对的。

它也可以写成dot,如果我可以将n 维度放在一个参数的最后,而将第二个维度放在另一个参数中。或tensordot。但对其他维度的广播控制较少。

对于测试计算,您还可以重新调整这些数组,以便 x,y,z 合并为一个,a,b 合并为另一个,例如

 M[xyz,:] = T_n[ab]*c[xyz,n]   # etc

【讨论】:

  • 是的,M 只是基数组T_n 的加权和。感谢您的清晰说明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 2022-06-30
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
相关资源
最近更新 更多