某些范围内整数的Python numpy乘积

某些范围内整数的Python numpy乘积,python,arrays,numpy,multidimensional-array,Python,Arrays,Numpy,Multidimensional Array,给定两个不同的n数组,A和B,这两个数组形状相同,但尺寸任意,如何得到n数组C,其中C是A和B(包括A和B)范围内所有整数的乘积 我的意思是A是开始数组,B是结束数组,我想要数组C,其中每个给定元素都是该元素开始值和停止值之间所有整数的乘积 因此,元素C[i,j,k…z]是A[i,j,k…z]和B[i,j,k…z]之间所有整数(包括)的乘积 实际尺寸的数量可以是3到N之间的任意值。您的计算可以用尺寸表示。Scipy有一个函数,用于计算上升阶乘(也称为Pochhammer函数) 对于整数标量a和b

给定两个不同的n数组,
A
B
,这两个数组形状相同,但尺寸任意,如何得到
n数组C
,其中
C
是A和B(包括A和B)范围内所有整数的乘积

我的意思是
A
是开始数组,
B
是结束数组,我想要数组
C
,其中每个给定元素都是该元素开始值和停止值之间所有整数的乘积

因此,元素
C[i,j,k…z]
A[i,j,k…z]
B[i,j,k…z]
之间所有整数(包括)的乘积


实际尺寸的数量可以是3到N之间的任意值。

您的计算可以用尺寸表示。Scipy有一个函数,用于计算上升阶乘(也称为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
返回浮点值。对于足够大的参数,结果将不准确。例如,这里使用Python的整数(具有任意精度)进行计算,使用
a=100
b=110

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不会有多大帮助。

如果您关心精确整数算术,是否应该使用
np.prod(np.arange())
version?最好有一个将此应用于数组的示例。不,因为numpy整数最终会溢出。如果任意输入需要精确的结果,则scipy和numpy不是合适的工具。那么,是否有一些方法可以使用Sympy(例如q函数Pochhammer)以任意精度进行此操作@Warren Weckesser好的,我发现了一个sympy falling factorial函数,可以达到任意精度:sympy.functions.combination.factorials.FallingFactorial。但它不是一个ufunc,所以我如何才能使它在FallingFactorial(a,B)输入上工作,其中a和B是我的数组,而不是现在在表达式/整数a和整数B上工作的方式?