2016-07-04 2 views
0

У меня есть этот кусок кода:Divide NumPy массив Python

n = np.load(matrix)["arr_0"] 
shape = n.shape 
##colsums and rowsums 
rows = {} 
cols = {} 
for i in xrange(shape[0]): #row 
    rows[i] = np.sum(n[i,:]) 
for j in xrange(shape[1]): #cols 
    cols[j] = np.sum(n[:,j]) 
##looping over bins 
for i in xrange(shape[0]): #row 
    print i 
    for j in xrange(shape[1]): #column 
     if rows[i] == 0 or cols[j] == 0: 
      continue 
     n[i,j] = n[i,j]/math.sqrt(rows[i]*cols[j]) 

Это в основном петли над Numpy матрицы с формой (50000,50000) и мне нужно разделить каждое значение для квадратного корня из произведения суммы соответствующий столбец на сумму соответствующей строки. Моя реализация занимает много времени. Есть ли у вас предложения по улучшению его работы?

+0

Там обычно нет необходимости в явном виде при помощи петель при использовании 'np.array'. Если вы тогда, вы, вероятно, слишком усложняете что-то. – DeepSpace

ответ

2

Вы можете просто взять суммы по отдельности на каждой оси, затем взять внешний продукт, а затем квадратный корень. Это можно немного конденсировать, но это дает вам представление о том, как его векторизовать.

# Sum of rows and columns 
a = numpy.sum(data, axis=1) 
b = numpy.sum(data, axis=0) 

# Product of sum and columns 
c = numpy.outer(a,b) 

# The square root... 
d = numpy.sqrt(c) 

# ...a nd the division 
data /= d 
+0

TypeError: выход ufunc 'divide' (typecode 'd') не может быть принудительно предоставлен для предоставленного выходного параметра (typecode 'h') в соответствии с правилом кастинга '' same_kind '' – user2979409

+1

Существует различие в типе между 'data' и' d', вы можете просто сделать 'data = data/d' вместо этого или найти/исправить разницу типов. – Benjamin

+0

Я думаю, что это порождает ошибку, так как у меня есть строки и столбцы, сумма которых равна 0. Таким образом, недействительное деление. – user2979409

Смежные вопросы