2012-06-11 3 views
2

можно определить вероятность для каждого элемента массива, просто выделив значение каждого элемента на сумму всех элементов массива. Я пытаюсь сделать это с помощью python для длинного списка массивов numpy. Мой код:Ошибка при вычислении вероятностей списка массивов

def calc_probs(self, array_list): 

    for array in array_list: 
     buffer=array.astype("float") 
     s=sum(buffer) 
     for e in np.nditer(buffer, op_flags=["readwrite"]): 
      e/=s 
     self.probs.append(buffer) 

Этот код должен работать. Фактически он работает при вводе его в интерактивный режим IPython. Результаты - это то, что я хочу, чтобы они были. Но если бы я сохранить код в файл унд перспективе, я всегда получаю следующее ValueError:

ValueError: non-broadcastable output operand with shape() doesn't match the broadcast shape (10)

Я не понимаю, почему эта ошибка встречается,, особенно при запуске из файла. Может ли кто-нибудь объяснить это мне и помочь решить проблему? Спасибо большое!

+0

Что вход выглядит? –

+1

В какой строке вы получаете исключение? И каковы ваши входы? – deadly

+0

Ввод представляет собой список массивов numpy формы: 'array_list = [np.array, np.array, np.array, ...]'. Все np массивы имеют 2d и имеют одинаковую форму (100x100). Ошибка возникает в строке 7 'e/= s' – MaxPowers

ответ

3

sum__builtin__.sum, который не знает, как суммировать массив NumPy, поэтому возвращает массив без изменений. Ошибка происходит потому, что вы пытаетесь разделить сингулярную матрицу e на матрицу 10x10 s.

Вы хотите s = np.sum(buffer).

Весь этот код может быть упрощена:

self.probs.append(array/np.sum(array)) 
+0

+1 как ipython в интерактивном режиме (--pylab) импортирует np.sum в качестве суммы, поэтому он работает в ipython, но не работает в файле, как упоминалось в OP. – bmu

+0

Большое спасибо за помощь! Теперь я понимаю, что происходит. :) – MaxPowers

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