我有一个2d numpy数组,我想以增量方式滚动每一行.我np.roll在for循环中使用这样做.但是因为我这几次打电话,我的代码真的很慢.你能帮我解决一下如何让它更快.
我的输入看起来像
array([[4,1],
[0,2]])
Run Code Online (Sandbox Code Playgroud)
我的输出看起来像
array([[4,1],
[2,0]])
Run Code Online (Sandbox Code Playgroud)
这里第0行[4,1]移动了0,第一行[0,2]移动了1.类似地,第二行将移动2,依此类推.
编辑
temp = np.zeros([dd,dd])
for i in range(min(t + 1, dd)):
temp[i,:] = np.roll(y[i,:], i, axis=0)
Run Code Online (Sandbox Code Playgroud) 如何制作以下MAD功能的滚动版本
from numpy import mean, absolute
def mad(data, axis=None):
return mean(absolute(data - mean(data, axis)), axis)
Run Code Online (Sandbox Code Playgroud)
这段代码是这个问题的答案
目前我将numpy转换为pandas然后应用此函数,然后将结果转换回numpy
pandasDataFrame.rolling(window=90).apply(mad)
Run Code Online (Sandbox Code Playgroud)
但是对于较大的数据帧,这是低效的.如何在没有循环的情况下获得numpy中相同函数的滚动窗口并给出相同的结果?
有什么简单的方法可以找出列表的趋势吗?
例如:
[5.0, 6.0, 9.0, 4.0, 10.0]。总体而言,其元素随时间而增加。[6.0, 4.0, 5.0, 4.0, 3.0]。随着时间的流逝,它的元素正在减少。理想情况下,我希望从此类列表中获得布尔值结果。
实际上,我想知道数据收集的趋势。不是线性增加或正好一一增加。在现实世界中,某些数据并不总是那么好,也许有四分之一的数据不如以前那么好(但不是太差,也就不是太多),但是只要其趋势良好,就可以很好。
是否可以在 numpy 中创建一个不是 C_CONTIGUOUS 或 F_CONTIGUOUS 的一维数组?
我认为连续的概念只对具有更多维度的数组有意义,但我在文档中找不到任何内容。
我尝试了以下方法来制作不连续的一维数组:
>>> np.empty(10).flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
>>> np.empty(10).copy('F').flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
Run Code Online (Sandbox Code Playgroud) 我有一些 NetCDF 文件,我需要从中绘制一些变量。我使用以下小代码来绘制我需要的数据:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
%matplotlib inline
import xarray as xr
os.chdir
fname = "/home/data.nc"
ds = xr.open_dataset(fname)
ds['Evap_obs'].plot()
plt.show()
Run Code Online (Sandbox Code Playgroud)
其工作正常并产生下图:
我现在的问题是这个情节不太可读。因此我希望事先平滑数据。为此我有这个小功能:
def mov_avg(x,window,min_count=None,axis=-1):
import bottleneck as bn
yy=np.ma.filled(np.ma.fix_invalid(x),np.nan)
yyF=np.ma.masked_all(yy.shape)
xtmp=bn.move_mean(yy,window,min_count=min_count,axis=axis)
wd1=(window-1)/2
ndim = len(yy.shape)
#print xtmp.shape,ndim,axis,window,wd1
if ndim ==1 :
#print wd1,-wd1,wd-1
yyF[wd1:-wd1]=np.ma.fix_invalid(xtmp[window-1:])
elif ndim == 2:
if axis==-1 or axis==1:
yyF[:,wd1:-wd1]=np.ma.fix_invalid(xtmp[:,window-1:])
elif axis==0:
yyF[wd1:-wd1,:]=np.ma.fix_invalid(xtmp[window-1:,:])
return yyF
Run Code Online (Sandbox Code Playgroud)
然后,当我希望对我的数据运行此函数以使其平滑时,如下所示(使用 7 个时间步长的窗口进行平滑):
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
%matplotlib inline
import xarray as …Run Code Online (Sandbox Code Playgroud)