- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一些大型数据集,我想将其拟合到单指数时间衰减。
数据由在不同时间获取的多个 4D 数据集组成,因此拟合应沿着第五维运行(通过数据集)。
我当前使用的代码如下:
import numpy as np
import scipy.optimize as opt
[... load 4D datasets ....]
data = (dataset1, dataset2, dataset3)
times = (10, 20, 30)
def monoexponential(t, M0, t_const):
return M0*np.exp(-t/t_const)
# Starting guesses to initiate descent.
M0_init = 80.0
t_const_init = 50.0
init_guess = (M0_init, t_const_init)
def fit(vector):
try:
nlfit, nlpcov = opt.curve_fit(monoexponential, times, vector,
p0=init_guess,
sigma=None,
check_finite=False,
maxfev=100, ftol=0.5, xtol=1,
bounds=([0, 2000], [0, 800]))
M0, t_const = nlfit
except:
t_const = 0
return t_const
# Concatenate datasets in data into a single 5D array.
concat5D = np.concatenate([block[..., np.newaxis] for block in data],
axis=len(data[0].shape))
# And apply the curve fitting along the last dimension.
decay_map = np.apply_along_axis(fit, len(concat5D.shape) - 1, concat5D)
代码工作正常,但需要很长时间(例如,对于dataset1.shape == (100,100,50,500)
)。我读过一些其他主题,提到 apply_along_axis
非常慢,所以我猜这就是罪魁祸首。不幸的是,我真的不知道这里可以使用什么作为替代方案(除了显式的 for 循环?)。
有人知道我可以做什么来避免 apply_along_axis
并加速 curve_fit 被多次调用吗?
最佳答案
因此,您要对一维数组应用 fit
操作 100*100*50*500 次(示例中包含 3 个值,现实生活中更多?)?
apply_along_axis
会迭代输入数组的所有维度(一维除外)。无需同时在多个轴上进行编译或执行此fit
操作。
如果没有 apply_along_axis
,最简单的方法是将数组 reshape 为二维数组,将 (100,100,50,500) 压缩到一维 (250...,),然后对其进行迭代。然后 reshape 结果。
我认为在最后一个轴上连接数据集
可能比在第一个轴上连接数据集慢,但时间显示并非如此。
np.stack
是 concatenate
的新版本,可以轻松在任何位置添加新轴。
In [319]: x=np.ones((2,3,4,5),int)
In [320]: d=[x,x,x,x,x,x]
In [321]: np.stack(d,axis=0).shape # same as np.array(d)
Out[321]: (6, 2, 3, 4, 5)
In [322]: np.stack(d,axis=-1).shape
Out[322]: (2, 3, 4, 5, 6)
对于更大的列表(使用简单的 sum
函数):
In [295]: d1=[x]*1000 # make a big list
In [296]: timeit np.apply_along_axis(sum,-1,np.stack(d1,-1)).shape
10 loops, best of 3: 39.7 ms per loop
In [297]: timeit np.apply_along_axis(sum,0,np.stack(d1,0)).shape
10 loops, best of 3: 39.2 ms per loop
使用数组 reshape 时间的显式循环大约相同
In [312]: %%timeit
.....: d2=np.stack(d1,-1)
.....: d2=d2.reshape(-1,1000)
.....: res=np.stack([sum(i) for i in d2],0).reshape(d1[0].shape)
.....:
10 loops, best of 3: 39.1 ms per loop
但是像 sum
这样的函数可以在整个数组上工作,而且速度更快
In [315]: timeit np.stack(d1,-1).sum(-1).shape
100 loops, best of 3: 3.52 ms per loop
因此改变堆叠和迭代方法不会对速度产生太大影响。但改变“配合”使其可以在多个维度上工作可能会有很大帮助。我对 optimize.fit 的了解不够,不知道这是否可行。
====================
我刚刚深入研究了 apply_along_axis
的代码。它基本上构建了一个类似于 ind=(0,1,slice(None),2,1) 的索引,并执行 func(arr[ind]) ,并且然后递增它,像带有进位的长算术一样排序。因此,它只是系统地逐步遍历所有元素,同时保持一个轴为 :
切片。
关于python - Curve_fit 到 apply_along_axis。如何加快速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38175464/
我想使用 ffmpeg 框架更改视频速度。我为此使用了这个命令: ffmpeg -y -i /storage/extSdCard/Video/1.avi -filter_complex [0:v]fp
我有以下数据数组,有 200 万个条目: [20965 1239 296 231 -1 -1 20976 1239 299 314 147 337 255
我正在使用 Oracle 数据库,并且想获取一个包含 3000 万条记录的表。 library(RODBC) ch <- odbcConnect("test", uid="test_user",
我在 android 上使用 FFmpeg 来: 1- 合并 3 个视频 2-添加音频 3-添加标志 4-修剪 3 个视频之一 5-改变输出的fps 我已经实现了正确的代码,但花了 30 分钟。对于(
我使用 GLPKMathProgInterface 和 JuMP 编写了一个程序来解决 Julia 中的线性程序。 Julia 代码由 python 程序调用,该程序通过多个命令行调用运行多个 Jui
我们使用 POV-Ray 每次运行生成大约 80 张图像,我们将这些图像拼接在一起形成两个移动的 GIF 文件(一个场景的两个 360 度 View )。我们正在寻找尽可能加快此镜像创建的方法(在 h
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我将数据从一个数据库插入到另一个数据库,所以我有 2 个连接(Conn1 和 Conn2)。下面是代码(使用pypyodbc)。 import pypyodbc Conn1_Query = "SE
在我的应用程序中,我显示 EKEvents 列表,我想在 UITableView 中显示一个月的所有事件,每个部分包含各自的日期。嗯,这可行,我得到了我需要的所有数据,但获取速度非常慢。 问题在于事件
我有一个移动速度非常慢的传送带。我不知道什么JS脚本控制速度,我需要它来加速。无法从主题制作者那里获得任何帮助。任何建议都会非常有帮助。谢谢 页面: http://krankgolf2017.wpen
有没有办法加快这段代码的速度?我需要它来删除相同的内容并将其写入单元格,以强制其他 VBA 代码运行另一列上的代码。这就是它的作用,只是 super 慢。有时此表上有 2000 个条目/行。每个单元大
我正在开发一个相当大的程序,它再次从一个相当大的 Excel 电子表格中获取数据。由于一些奇怪的原因,加载这个大的 Excel 文件需要很长时间,我希望能以某种方式加快速度。我做了自己的研究并尝试了
我有下面的代码,将所有按钮(有 10 个)着色为灰色,以清除任何先前着色的按钮,然后将所选按钮着色为蓝色。基本上充当当前选择哪个按钮的指示器。我注意到代码现在需要一些时间才能通过这种修饰添加来运行,我
我有一个 LINQ 查询,它正在搜索包含大约 250,000 条记录的 SQL 表,并且仅搜索 2 个字段。这两个字段都已建立索引,但我发现它的运行速度仍然相当慢。 下面是代码,有人可以提出任何建议来
对于相对较大的 Pandas DataFrame(几十万行),我想创建一个应用函数结果的系列。问题是该功能不是很快,我希望它能以某种方式加快速度。 df = pd.DataFrame({ 'valu
这个问题在这里已经有了答案: Faster weighted sampling without replacement (3 个答案) 关闭 9 年前。 如何在 R 中加快概率加权采样。 # Let
在运行 PhantomJS 提供的 rasterize.js 示例时,我发现我必须等待 20 秒或更长时间才能生成网页图像。 有没有可能在不消耗大量资源的情况下加快速度的方法?我基本上希望快速生成从加
我正在开发一个相当大的程序,它再次从一个相当大的 Excel 电子表格中获取数据。由于一些奇怪的原因,加载这个大的 Excel 文件需要很长时间,我希望能以某种方式加快速度。我做了自己的研究并尝试了
我有下面的代码,将所有按钮(有 10 个)着色为灰色,以清除任何先前着色的按钮,然后将所选按钮着色为蓝色。基本上充当当前选择哪个按钮的指示器。我注意到代码现在需要一些时间才能通过这种修饰添加来运行,我
我有一个 Excel 工作簿,用户通过单击按钮导入文本文件。我的代码完全按照我的需要工作,但是在填写 H 列“阅读日期”时速度非常慢。将文本文件导入 Excel 工作表后,我的 Excel 工作簿如下
我是一名优秀的程序员,十分优秀!