2012-03-20 3 views
0

У меня есть два массива numpy X и W каждый с формой (N,N), которая возникает из-за конца вычисления. Разбить диапазон X равными интервалами [min(X), min(X)+delta, min(X)+2*delta,..., max(X)]. Я хотел бы знать, учитывая интервал отправную точку v, сумма соответствующих W значений (т. Е весь спектр X)Условная сумма над матрицами в python/numpy

idx = (X>=v) & (X<(v+delta)) 
W[idx].sum() 

Мне нужна эта сумма для всех стартовых интервалов, и мне нужно сделайте это для многих разных матриц X и W. Профилирование определило, что это узкое место. То, что я сейчас делаю, составляет:

W_total = [] 
for v0, v1 in zip(X, X[1:]): 
    idx = (X>=x0) & (X<x1) 
    W_total.append(W[idx].sum()) 

Как я могу ускорить это?

ответ

1

Вы можете использовать numpy.histogram(), чтобы вычислить все эти суммы в одной операции:

sums, bins = numpy.histogram(
    X, bins=numpy.arange(X.min(), X.max(), delta), weights=W) 
1

Вы пробовали numpy.histogram?

nbins = (X.max() - X.min())/delta 
W_total = np.histogram(X, weights=W, bins=nbins) 
Смежные вопросы