鉴于2个不同的NDarray,A
和B
,两者具有相同的形状但是任意尺寸,我如何获得NDarray C
,其中C
是 A和B之间所有整数的乘积(包括)。
通过这个,我的意思是A
是起始数组,B
是结束数组,我想要数组C
,其中每个给定的元素都是所有元素的乘积该元素的起始值和停止值之间的整数。
因此,元素C[i,j,k...z]
是A[i,j,k...z]
和B[i,j,k,...z]
之间所有整数(包括)的乘积。
实际维数可以是3到N之间的任何值。
答案 0 :(得分:1)
您的计算可以用rising factorial来表示。 Scipy有一个函数scipy.special.poch(z, m)
来计算上升阶乘(也称为Pochhammer函数)。
对于整数标量a
和b
,您需要a*(a+1)*(a+2)*...*b
。这可以使用Pochhammer函数编写poch(a, b - a + 1)
(假设b
> = a
)。
这是一个标量示例:
In [88]: import numpy as np
In [89]: from scipy.special import poch
In [90]: a = 2
In [91]: b = 5
计算a
到b
的整数乘积:
In [92]: np.prod(np.arange(a, b+1))
Out[92]: 120
poch(a, b - a + 1)
给出相同的结果:
In [93]: poch(a, b - a + 1)
Out[93]: 120.0
poch
是一个“ufunc”,因此它将在数组上以元素方式运行:
In [94]: a = np.array([[2, 3], [4, 5]])
In [95]: b = np.array([[3, 5], [6, 9]])
In [96]: poch(a, b - a + 1)
Out[96]:
array([[ 6.00000000e+00, 6.00000000e+01],
[ 1.20000000e+02, 1.51200000e+04]])
poch
返回浮点值。对于足够大的参数,结果将不是精确的。例如,使用a = 100
和b = 110
,使用Python的整数(具有任意精度)进行计算:
In [50]: from functools import reduce
In [51]: a = 100
In [52]: b = 110
In [53]: reduce(lambda x, y: x*y, range(a, b+1), 1)
Out[53]: 17018214378110225280000
该值超出了64位整数的限制,并且无法使用64位浮点精确表示。
如果您需要完全结果任意输入,numpy和scipy将没有多大帮助。