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

将具有形状 (x,y,z) 和 (x,) 的 numpy 数组相乘和

将具有形状 (x,y,z) 和 (x,) 的 numpy 数组相乘和

jeck猫 2022-09-20 15:59:46
所以我有一个3D数据集(x,y,z),我想用一组权重对其中一个轴(x)求和,w = w(x)。我正在求和的开始和结束索引对于每个(y,z)都是不同的,我通过屏蔽3D数组解决了这个问题。对于我没有求和的两个变量,权重是恒定的。关于实现和数学的答案都是值得赞赏的(有没有一种聪明的方法?我有一个形状 (x,y,z) 的 3D 遮罩数组 (A) 和一个形状 (x,) 的 1D 数组 (t)。有没有一种好方法可以将A中的每个(y,z)元素与t中的相应数字相乘,而无需将t扩展到3D数组?我目前的解决方案是使用np.tensordot来制作一个与A形状相同的3D数组,该数组包含所有t值,但是花费运行时构建“new_t”数组感觉非常不令人满意,该数组实际上只是t的y * z副本。当前解决方案示例:a1 = np.array([[1,2,3,4],               [5,6,7,8],               [9,10,11,12]])a2 = np.array([[0,1,2,3],               [4,5,6,7],               [8,9,10,11]])#note: A is a masked array, mask is a 3D array of boolsA = np.ma.masked_array([a1,a2],mask)t = np.array([10,11])new_t = np.tensordot(t, np.ones(A[0].shape), axes = 0)return np.sum(A*new_t, axis=0)从本质上讲,我想以尽可能短的运行时间对所有i,j执行t*A[:,i,j],最好不使用太多其他库,而不是numpy和scipy。产生所需输出的另一种方法(同样,运行时间太长):B = [[t*A[:,i,j] for j in range(A.shape[2])] for i in range(A.shape[1])]return np.sum(B,axis=2)
查看完整描述

2 回答

?
开心每一天1111

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

arr1 = np.tensordot(A.T,t,axes=1).T

arr1

array([[ 10,  31,  52,  73],

       [ 94, 115, 136, 157],

       [178, 199, 220, 241]])


查看完整回答
反对 回复 2022-09-20
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

像@alyhosny建议的那样使用张量是有效的,但是使用零替换掩蔽的值


A = np.ma.MaskedArray.filled(A,0)

在与einsum求和之前(感谢@phipsgabler)给了一半的运行时间。最终代码:


A = np.ma.MaskedArray(A,mask)

A = np.ma.MaskedArray.filled(A,0)

return np.einsum('ijk,i->jk',A,t)


查看完整回答
反对 回复 2022-09-20
  • 2 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

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