2017-01-19 8 views
1

У меня есть 3D-массив numpy [tbl_idx, rows, cols], которые представляют собой несколько 2D-таблиц. Я хочу суммировать каждую строку в каждой таблице, а затем делить каждый элемент каждой таблицы на соответствующую сумму строки.Разделение 3D-массива на суммы двумерных строк?

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, вы получите NaNs и Infs в положениях соответствия в выводе. Для того, чтобы установить их в качестве 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

супер классный;), есть ли способ установить для ZERO все nan и inf. Я могу добавить 1 до операции, но задавался вопросом, есть ли ярлык. – user1019129

+0

Я сделал это: ary [np.isnan (ary)] = 0. Закроет вопрос, потому что вы ответили на мой основной вопрос, спасибо. – user1019129