是否可以在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]
。
答案 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 ]])