将 3D 数组除以 2D 行总和?

Dividing 3D array by 2D row sums?

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

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

我可以按以下方式进行行求和:

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

但不知道如何做正确的除法 3D-ary/2D-row-sums。

你知道怎么做吗?

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

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

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

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

对于 zeros 的求和,您将在输出的相应位置得到 NaNsInfs。要在输出中将它们设置为 zeros,一种方法是使用 np.where -

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

或者,使用前面的代码得到除法输出,最后寻找有限的,并将 rest 设置为 zeros -

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