Python 矢量参数Numpy阵列广播
是否可以使用矢量参数在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
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 ]])