所以我有一个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]])
胡子哥哥
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)
添加回答
举报
0/150
提交
取消