Python 矢量参数Numpy阵列广播

Python 矢量参数Numpy阵列广播,python,numpy,Python,Numpy,是否可以使用矢量参数在numpy中进行阵列广播 例如,我知道我可以做到这一点 def bernoulli_fraction_to_logodds(fraction): if fraction == 1.0: return inf return log(fraction / (1 - fraction)) bernoulli_fraction_to_logodds = numpy.frompyfunc(bernoulli_fraction_to_logodds, 1

是否可以使用矢量参数在numpy中进行阵列广播

例如,我知道我可以做到这一点

def bernoulli_fraction_to_logodds(fraction):
    if fraction == 1.0:
        return inf
    return log(fraction / (1 - fraction))
bernoulli_fraction_to_logodds = numpy.frompyfunc(bernoulli_fraction_to_logodds, 1, 1)
让它和整个阵列一起工作。如果我有一个函数,它接受一个2元素向量并返回一个2元素向量呢。我能给它传递一个2元素向量数组吗?例如:

def beta_ml_fraction(beta):
    a = beta[0]
    b = beta[1]
    return a / (a + b)
beta_ml_fraction = numpy.frompyfunc(beta_ml_fraction, 1, 1)
不幸的是,这不起作用。是否有一个类似于from_py_func的函数可以工作。当它们是2元向量时,我可以解决这个问题,但是当它们是n元向量时呢


因此,输入
(2,3)
应该得到
0.4
,但是输入
[[2,3],[3,3]]
应该得到
[0.4,0.5]
我认为
frompyfunc
不能做到这一点,尽管我可能是错的

关于
np.矢量化

事实上,任何经历过的事情 python代码中的“合并两个” “标量”会很慢。缓慢的 python中的循环不是因为 python的循环构造很慢, 这是因为执行python代码非常困难 缓慢的所以矢量化是一种欺骗 -它实际上运行不快,但很方便

所以
np.frompyfunc
(和
np.vectorize
)只是语法上的糖分——它们不会让Python函数运行得更快。 意识到这一点后,我对
frompyfunc
的兴趣被标记(接近零)

Python循环没有什么不可读的地方,所以要么显式使用, 或者重写函数以真正利用numpy(通过编写真正的矢量化方程)


在处理二维向量数组时,我喜欢将x和y分量作为第一个索引。为此,我大量使用了转置()

这种方法的优点是处理二维向量的多维数组变得容易

x = np.arange(18,dtype=np.float).reshape(2,3,3)
print(x)
#array([[[  0.,   1.,   2.],
#        [  3.,   4.,   5.],
#        [  6.,   7.,   8.]],
#
#       [[  9.,  10.,  11.],
#        [ 12.,  13.,  14.],
#        [ 15.,  16.,  17.]]])
print(beta_ml_fraction(x))
#array([[ 0.        ,  0.09090909,  0.15384615],
#       [ 0.2       ,  0.23529412,  0.26315789],
#       [ 0.28571429,  0.30434783,  0.32      ]])
def beta_ml_fraction(beta):
        a = beta[0]
        b = beta[1]
   return a / (a + b)

arr=np.array([(2,3),(3,3)],dtype=np.float) 
print(beta_ml_fraction(arr.transpose()))
# [ 0.4  0.5]
x = np.arange(18,dtype=np.float).reshape(2,3,3)
print(x)
#array([[[  0.,   1.,   2.],
#        [  3.,   4.,   5.],
#        [  6.,   7.,   8.]],
#
#       [[  9.,  10.,  11.],
#        [ 12.,  13.,  14.],
#        [ 15.,  16.,  17.]]])
print(beta_ml_fraction(x))
#array([[ 0.        ,  0.09090909,  0.15384615],
#       [ 0.2       ,  0.23529412,  0.26315789],
#       [ 0.28571429,  0.30434783,  0.32      ]])