2016-03-13 4 views
1

У меня есть матрица отсчетов,Numpy процентов вдоль оси в 2d массива

import numpy as np 
x = np.array([[ 1,2,3],[1,4,6],[2,3,7]]) 

И мне нужен проценты от общего вдоль оси = 1:

for i in range(x.shape[0]): 
    for j in range(x.shape[1]): 
     x[i,j] = x[i,j]/np.sum(x[i,:]) 

In Numpy формы широковещательной передачи.

В настоящее время у меня есть:

x_sums = np.sum(x,axis=1) 
for j in range(x.shape[1]): 
    x[:,j] = x[:,j]/x_sums[:] 

который ставит большую часть сложности в Numpy кода ... но NumPy один лайнер будет лучше.

Кроме того,

def percentages(a): 
    return a/np.sum(a) 

x_percentages = np.apply_along_axis(percentages,1,x) 

Но до сих пор включает в себя питона.


np.linalg.norm 

очень близко, с точки зрения того, что происходит, но у них есть только 8 жёстко прописанные нормы, которые не включают в себя процент от общей суммы.

Тогда есть np.percentile, который снова близок ... но он вычисляет отсортированный процентиль.

ответ

5
x /= x.sum(axis=1, keepdims=True) 

Altough x должен иметь точку DTYPE плавающей для этого, чтобы работать правильно.

Лучше может быть:

x = np.true_divide(x, x.sum(axis=1, keepdims=True)) 
+0

Nice! Я думаю, что это будет сделано. спасибо – bordeo

2

Может быть, это то, что вы после:

print (x.T/np.sum(x, axis=1)).T 
Смежные вопросы