【问题标题】:Numpy array broadcasting with vector parameters带有矢量参数的 Numpy 数组广播
【发布时间】:2010-10-27 06:17:15
【问题描述】:

是否可以在 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]

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    我不认为frompyfunc 可以做到这一点,尽管我可能是错的。

    关于np.vectorizeA. 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]
    

    【讨论】:

      【解决方案2】:

      在处理二维向量数组时,我喜欢将 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      ]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-03
        • 1970-01-01
        • 2016-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多