Numpy数组广播与矢量参数

时间:2010-10-26 13:54:01

标签: 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, 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]

2 个答案:

答案 0 :(得分:4)

我认为frompyfunc可以做到这一点,但我可能错了。

关于np.vectorize A. M. Archibald wrote

  

事实上,任何事情都会发生   用于“结合两个”的python代码   标量“会很慢。慢   在python中循环不是因为   python的循环结构很慢,   这是因为执行python代码是   慢。因此,矢量化是一种欺骗    - 它实际上并不快速运行,但很方便。

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

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

import numpy as np

def beta_ml_fraction(beta):    
    a = beta[:,0]
    b = beta[:,1]
    return a / (a + b)


arr=np.array([(2,3)],dtype=np.float)
print(beta_ml_fraction(arr))
# [ 0.4]

arr=np.array([(2,3),(3,3)],dtype=np.float)
print(beta_ml_fraction(arr))
# [ 0.4  0.5]

答案 1 :(得分:1)

当处理二维矢量数组时,我喜欢将x和y分量保持为第一个索引。为此,我大量使用transpose()

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      ]])