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

时间:2016-12-13 00:49:44

标签: python arrays numpy multidimensional-array

鉴于2个不同的NDarray,AB,两者具有相同的形状但是任意尺寸,我如何获得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之间的任何值。

1 个答案:

答案 0 :(得分:1)

您的计算可以用rising factorial来表示。 Scipy有一个函数scipy.special.poch(z, m)来计算上升阶乘(也称为Pochhammer函数)。

对于整数标量ab,您需要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

计算ab的整数乘积:

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 = 100b = 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将没有多大帮助。