【问题标题】:How to correctly vectorise a function using numpy?如何使用 numpy 正确矢量化函数?
【发布时间】:2015-09-08 14:29:04
【问题描述】:

我是 numpy 的新手,我一定在这里做一些愚蠢的事情,但我想要的只是生成一个 4 维概率分布数组。我不明白为什么我的矢量化函数会返回这个声称是np.ndarray 类型但打印出来的奇怪对象。此外,当我调用self.inputSpace[:,0] 时,它会返回错误。

这是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.])]

【问题讨论】:

标签: arrays python-3.x numpy


【解决方案1】:

在这里为正在搜索的人找到答案: Using Numpy Vectorize on Functions that Return Vectors

tl;博士:

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

【讨论】:

  • 那里的第二个答案可能也值得一读:np.vectorize 只是一个方便的功能,所以在这里使用并不是很有用,因为你正在为它提供一个 numpy 数组,并期待一个回报。由于vectorize 不会加速你的代码,你可能只想重写你的函数来做你需要的,而不使用vectorize
猜你喜欢
  • 2020-04-06
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多