+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

一定范围内的整数的python numpy乘积

发布于2020-05-16 19:06     阅读(1349)     评论(0)     点赞(26)     收藏(1)


给定2个不同的NDarray,A并且B都具有相同的形状但具有任意尺寸,我如何得到NDarray C,其中A和B(含)之间的所有整数C乘积为

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

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

实际的尺寸数可以是3到N。


解决方案


您的计算可以用上升的阶乘表示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

计算从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 = 100b = 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不会有太大帮助。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/374824/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

26 0
收藏该文
已收藏

评论内容:(最多支持255个字符)