许多numpy函数提供了在特定轴上操作的选项,使用axis=参数。我的问题是:
但是,如果我的基础函数需要多维输入呢?例如,要在np矩阵A(形状为(5,6,2,3,4))的前两个维度(5,6)上找到2-D移动平均值B。像一个通用函数B = f_moving_mean(A,axis=(0,1))。
我目前的解决方案是使用numpy.swapaxes和numpy.reshape来实现。一个1-D移动平均函数的示例代码如下:
这是实现问题2的常见/高效方法吗?欢迎任何改进/建议/新方法。 PS. 我之所以涉及pandas,是因为它的rolling(...).mean()方法能够正确处理nan数据。 编辑:我想另一种问问题的方式可能是:循环遍历“动态”数量的维度的语法是什么?
- 这些'along axis'操作是如何实现的?或者更直接的问题
- 我如何高效地编写自己的函数,提供类似的选项?
但是,如果我的基础函数需要多维输入呢?例如,要在np矩阵A(形状为(5,6,2,3,4))的前两个维度(5,6)上找到2-D移动平均值B。像一个通用函数B = f_moving_mean(A,axis=(0,1))。
我目前的解决方案是使用numpy.swapaxes和numpy.reshape来实现。一个1-D移动平均函数的示例代码如下:
import pandas as pd
import numpy as np
def nanmoving_mean(data,window,axis=0):
kw = {'center':True,'window':window,'min_periods':1}
if len(data.shape)==1:
return pd.Series(data).rolling(**kw).mean().as_matrix()
elif len(data.shape)>=2:
tmp = np.swapaxes(data,0,axis)
tmpshp = tmp.shape
tmp = np.reshape( tmp, (tmpshp[0],-1), order='C' )
tmp = pd.DataFrame(tmp).rolling(**kw).mean().as_matrix()
tmp = np.reshape( tmp, tmpshp, order='C' )
return np.swapaxes(tmp,0,axis)
else:
print('Invalid dimension!')
return None
data = np.random.randint(10,size=(2,3,6))
print(data)
nanmoving_mean(data,window=3,axis=2)
这是实现问题2的常见/高效方法吗?欢迎任何改进/建议/新方法。 PS. 我之所以涉及pandas,是因为它的rolling(...).mean()方法能够正确处理nan数据。 编辑:我想另一种问问题的方式可能是:循环遍历“动态”数量的维度的语法是什么?
apply_along_axis
并不能帮助你。 - Divakar