某些范围内整数的Python numpy乘积
给定两个不同的n数组,某些范围内整数的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
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上工作的方式?