用2D行总和划分3D数组?

时间:2017-01-19 21:55:36

标签: python numpy 3d division

我有一个3D numpy数组ary [tbl_idx,rows,cols],它代表多个2D表。 我想对每个表中的每一行求和,然后将每个表的每个元素除以相应的行和。

即。每个表都是基于行概率的..

我可以通过以下方式进行行和:

ary.sum(axis=2).astype(np.float)

但无法弄清楚如何正确划分3D-ary / 2D-row-sum。

你知道吗?

1 个答案:

答案 0 :(得分:4)

你可以使用keepdims=1来保持求和时的维数,然后简单地执行除法,就像这样 -

ary/ary.sum(axis=2, keepdims=1).astype(np.float)

或者,如果您已经保存了总和,我们可以通过引入一个带3D的新轴将其扩展到None/np.newaxis,然后执行除法,就像这样 -

ary/ary.sum(axis=2).astype(np.float)[...,None]

对于zeros的摘要,您会在输出中的correspoding位置获得NaNsInfs。要在输出中将其设置为zeros,一种方法是使用np.where -

sums = ary.sum(axis=1,keepdims=1)
out = np.where(sums!=0, ary/sums.astype(np.float),0)

或者,使用前面的代码获取除法输出,最后查找有限值并将其设置为zeros -

np.where(np.isfinite(out1), out1,0) # out1 is o/p from earlier section