Python 用乘法列表替换数字列表

Python 用乘法列表替换数字列表,python,list,performance,numpy,multiplication,Python,List,Performance,Numpy,Multiplication,我有一个编号列表arr和一个窗口大小n。 我想高效地(可能使用numpy)计算一个新列表,其中列表中的每个新元素都是窗口中所有元素的乘积。 例如,如果arr=[1,2,3,4,5]和n=3我希望它返回res=[6,24,60],对于n=2我希望[2,6,12,20],我的解决方案就是熊猫 将熊猫作为pd导入 将numpy作为np导入 arr=pd.系列([1,2,3,4,5]) 窗口大小=3 滚动=arr.滚动(窗口大小) 结果=滚动应用(np.prod) 结果数组的长度与原始数组相同,第一个

我有一个编号列表
arr
和一个窗口大小
n
。 我想高效地(可能使用numpy)计算一个新列表,其中列表中的每个新元素都是窗口中所有元素的乘积。
例如,如果
arr=[1,2,3,4,5]
n=3
我希望它返回
res=[6,24,60]
,对于
n=2
我希望
[2,6,12,20]
,我的解决方案就是熊猫

将熊猫作为pd导入
将numpy作为np导入
arr=pd.系列([1,2,3,4,5])
窗口大小=3
滚动=arr.滚动(窗口大小)
结果=滚动应用(np.prod)
结果数组的长度与原始数组相同,第一个元素设置为NaN。 您可以使用
result.dropna(inplace=True)
轻松删除它们。
我希望您可以使用熊猫,它们的滚动窗口功能非常好

我的解决方案涉及熊猫

将熊猫作为pd导入
将numpy作为np导入
arr=pd.系列([1,2,3,4,5])
窗口大小=3
滚动=arr.滚动(窗口大小)
结果=滚动应用(np.prod)
结果数组的长度与原始数组相同,第一个元素设置为NaN。 您可以使用
result.dropna(inplace=True)
轻松删除它们。
我希望您可以使用熊猫,它们的滚动窗口功能非常好

如果您想要一个非numpy解决方案,可以使用切片对循环执行此操作:

从操作员导入mul
从functools导入reduce
def切片器(lst,n):
i=0
尽管如此:
_切片=lst[i:i+n]
如果不是len(_slice)==n:
打破
减产(多个,每片)
i+=1
>>>列表(切片器(arr,3))
[6, 24, 60]
>>>列表(切片器(arr,2))
[2, 6, 12, 20]
或者,使用
for
循环:

def切片器(lst,n): 对于范围内的i(透镜(lst)-n+1): _切片=lst[i:i+n] 减产(多个,每片) >>>列表(切片器(arr,3)) [6, 24, 60] >>>列表(切片器(arr,2)) [2, 6, 12, 20]
如果您想要一个非numpy解决方案,可以使用切片在循环中执行此操作:

从操作员导入mul
从functools导入reduce
def切片器(lst,n):
i=0
尽管如此:
_切片=lst[i:i+n]
如果不是len(_slice)==n:
打破
减产(多个,每片)
i+=1
>>>列表(切片器(arr,3))
[6, 24, 60]
>>>列表(切片器(arr,2))
[2, 6, 12, 20]
或者,使用
for
循环:

def切片器(lst,n): 对于范围内的i(透镜(lst)-n+1): _切片=lst[i:i+n] 减产(多个,每片) >>>列表(切片器(arr,3)) [6, 24, 60] >>>列表(切片器(arr,2)) [2, 6, 12, 20] 使用SciPy并传入NumPy作为应用于每个切片的函数可以做到:

[86]中的
:将numpy作为np导入
…:从scipy.ndimage导入通用过滤器作为gf
[87]中:def减速器(arr,n):
…:start=n//2
…:stop=len(arr)-(n-1)//2
…:结果=gf(arr,np.prod,n,mode='constant',cval=0)
…:返回结果[开始:停止]
[88]中:arr=np.array([1,2,3,4,5])
In[89]:异径管(arr,2)
Out[89]:数组([2,6,12,20])
In[90]:异径管(arr,3)
Out[90]:数组([6,24,60])
In[91]:异径管(arr,4)
Out[91]:数组([24120])
使用SciPy并传入NumPy作为应用于每个切片的函数可以做到:

[86]中的
:将numpy作为np导入
…:从scipy.ndimage导入通用过滤器作为gf
[87]中:def减速器(arr,n):
…:start=n//2
…:stop=len(arr)-(n-1)//2
…:结果=gf(arr,np.prod,n,mode='constant',cval=0)
…:返回结果[开始:停止]
[88]中:arr=np.array([1,2,3,4,5])
In[89]:异径管(arr,2)
Out[89]:数组([2,6,12,20])
In[90]:异径管(arr,3)
Out[90]:数组([6,24,60])
In[91]:异径管(arr,4)
Out[91]:数组([24120])

有意思,像是一种减窗器?是的,像那样有趣,像是一种减窗器?是的,像那样我希望它尽可能简单易懂,速度尽可能快。如果可能的话,我想可以用numpy oneliner完成solution@GalSuchetzky在许多行上添加一个要求并不总是可取的。Enrico的pandas解决方案可以用一行来表达,但如果将其分解,则会读得更好。我希望它尽可能简单易懂,并且尽可能快。如果可能的话,我想可以用numpy oneliner完成solution@GalSuchetzky在许多行上添加一个要求并不总是可取的。Enrico的pandas解决方案可以用一行来表示,但如果将其分解,则读起来会更好一些