2017-01-19 53 views
1

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

I.e.每个表是基于行的概率..

我可以做下面的方式行和:

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

,但无法弄清楚如何做正确的划分3D元/ 2D-行总和。

你知道吗?

回答

3

你可以使用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] 

对于summatio ns为zeros,则输出中的对应位置将得到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 
+0

超级酷;),是否有一些方法来设置为零所有nan和inf。我可以在手术前加1,但想知道是否有捷径。 – user1019129

+0

我做到了这一点:ary [np.isnan(ary)] = 0.将结束这个问题,因为你回答了我的主要问题,谢谢。 – user1019129