首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NumPy/SciPy?

NumPy/SciPy?
EN

Stack Overflow用户
提问于 2012-12-12 05:13:26
回答 2查看 3.2K关注 0票数 18

在numpy或scipy (或其他库)中,有没有一个函数可以将cumsum和cumprod的概念推广到任意函数。例如,考虑(理论)函数

代码语言:javascript
复制
cumf( func, array) 

func是一个接受两个浮点数的函数,并返回一个浮点数。特殊情况

代码语言:javascript
复制
lambda x,y: x+y 

代码语言:javascript
复制
lambda x,y: x*y 

分别是cumsum和cumprod。例如,如果

代码语言:javascript
复制
func = lambda x,prev_x: x^2*prev_x 

我将其应用于:

代码语言:javascript
复制
cumf(func, np.array( 1, 2, 3) )

我想要

代码语言:javascript
复制
np.array( 1, 4, 9*4 )
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-12 05:14:31

NumPy的ufuncs有accumulate()

代码语言:javascript
复制
In [22]: np.multiply.accumulate([[1, 2, 3], [4, 5, 6]], axis=1)
Out[22]: 
array([[  1,   2,   6],
       [  4,  20, 120]])

不幸的是,在frompyfunc()'ed Python函数上调用accumulate()失败,并显示一个奇怪的错误:

代码语言:javascript
复制
In [32]: uadd = np.frompyfunc(lambda x, y: x + y, 2, 1)

In [33]: uadd.accumulate([1, 2, 3])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

ValueError: could not find a matching type for <lambda> (vectorized).accumulate, 
            requested type has type code 'l'

它使用的是NumPy 1.6.1和Python2.7.3。

票数 12
EN

Stack Overflow用户

发布于 2015-01-13 07:11:00

上面的ValueError仍然是一个使用Numpy 1.20.1 (使用Python3.9.1)的bug。

幸运的是,发现了一种使用强制转换的解决方法:https://groups.google.com/forum/#!topic/numpy/JgUltPe2hqw

代码语言:javascript
复制
import numpy as np
uadd = np.frompyfunc(lambda x, y: x + y, 2, 1)
uadd.accumulate([1,2,3], dtype=object).astype(int)
# array([1, 3, 6])

请注意,由于自定义操作在对象类型上工作,因此它不会从numpy的有效内存管理中受益。因此,对于非常大的数组,该操作可能比不需要强制转换为object的操作慢。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13828599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档