2015-09-08 4 views
0

Я новичок в numpy, и я должен делать что-то глупое здесь, но все, что я хочу, - это создать массив распределений вероятности по четырем размерам. Я не понимаю, почему моя векторная функция возвращает этот странный объект, который утверждает, что имеет тип np.ndarray, но не печатает как один. Кроме того, он возвращает ошибку, когда я вызываю self.inputSpace[:,0].Как правильно векторизовать функцию с помощью numpy?

Вот все содержание test.py:

import numpy as np 

def generateDist(i,j,k): 
    return np.squeeze(np.array([i*j,i*(1-j),(1-i)*k,(1-i)*(1-k)])) 

generateDist = np.vectorize(generateDist,otypes=[np.ndarray]) 

class distributionSpace(): 
    def __init__(self): 
     self.grid = 3 # set to 3 for simplicity 
     self.inputSpace = np.array([]) 

    def generateDistribution(self): 
     alpha = np.linspace(0.,1.,self.grid) 
     beta = np.linspace(0.,1.,self.grid) 
     gamma = np.linspace(0.,1.,self.grid) 
     i , j , k = np.meshgrid(alpha,beta,gamma) 
     i = np.squeeze(i.flatten()) 
     j = np.squeeze(j.flatten()) 
     k = np.squeeze(k.flatten()) 
     self.inputSpace = generateDist(i,j,k) 
     print(self.inputSpace) 
     return self 

if __name__ == '__main__': 
    distributionSpace().generateDistribution() 

И вот результат я получил:

$ python3 test.py 
[array([ 0., 0., 0., 1.]) array([ 0. , 0. , 0.5, 0.5]) 
array([ 0., 0., 1., 0.]) array([ 0. , 0.5, 0. , 0.5]) 
array([ 0. , 0.5 , 0.25, 0.25]) array([ 0. , 0.5, 0.5, 0. ]) 
array([ 0., 1., 0., 0.]) array([ 0., 1., 0., 0.]) 
array([ 0., 1., 0., 0.]) array([ 0., 0., 0., 1.]) 
array([ 0. , 0. , 0.5, 0.5]) array([ 0., 0., 1., 0.]) 
array([ 0.25, 0.25, 0. , 0.5 ]) array([ 0.25, 0.25, 0.25, 0.25]) 
array([ 0.25, 0.25, 0.5 , 0. ]) array([ 0.5, 0.5, 0. , 0. ]) 
array([ 0.5, 0.5, 0. , 0. ]) array([ 0.5, 0.5, 0. , 0. ]) 
array([ 0., 0., 0., 1.]) array([ 0. , 0. , 0.5, 0.5]) 
array([ 0., 0., 1., 0.]) array([ 0.5, 0. , 0. , 0.5]) 
array([ 0.5 , 0. , 0.25, 0.25]) array([ 0.5, 0. , 0.5, 0. ]) 
array([ 1., 0., 0., 0.]) array([ 1., 0., 0., 0.]) 
array([ 1., 0., 0., 0.])] 
+0

Возможный дубликат [Использование вложения векторов для функций, возвращающих векторы] (http://stackoverflow.com/questions/3379301/using-numpy-vectorize-on-functions-that-return-vectors) – tom

ответ

0

Обнаружили ответ здесь для людей, которые ищут: Using Numpy Vectorize on Functions that Return Vectors

ТЛ; dr:

self.inputSpace = np.array(generateDist(i,j,k).tolist()) 
+1

Возможно, стоит прочитать второй ответ тоже: «np.vectorize» - это просто удобная функция, поэтому на самом деле это не так полезно использовать здесь, поскольку вы кормите его массивом «numpy» и ожидаете его взамен. Поскольку 'vectorize' не ускорит ваш код, вы можете просто переписать свою функцию, чтобы делать то, что вам нужно, не используя' vectorize' – tom

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