我有一个2D阵列(典型大小约400x100)如图所示(它看起来像一个梯形,因为右下方的元素是nan)。对于数组中的每个元素,我想在列中为几个元素(大约10个元素的顺序)执行数值积分。在物理语言中,将颜色视为力的大小,我想通过计算Fdz的积分来找到完成的工作。我可以使用双for循环并使用<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<path id="a" d="M40 50 A 45 45 0,0,0 80 90 L 80 50 Z" fill="#bf1238"></path>
<path id="a" d="M120 50 A 45 45 0,0,1 80 90 L 80 50 Z" fill="#bf1238"></path>
</svg>
来完成这项工作,但是还有其他更有效的方法(可能是使用数组和向量化)来在Matlab或python中完成吗?我的最终目标是找到评估积分最大的点。因此,从黄色代表大值的图像中,我们期望积分在虚线上方的右侧某处是最大的。
另外,如果我想要整合的点数是一个整数,这是相对容易的,但如果我想整合,比如说7.5分呢?我正在考虑使用trap
来插入点,但我不确定这是否会使任务过于复杂。
答案 0 :(得分:3)
您可以使用cumsum
来加速trap
。计算累积和(@Benjamin提出的1维积分图像)
>>> import numpy as np
>>> csdata = np.cumsum(data, axis=1)
与离散长度
集成>>> npoints = 6
>>> result = np.zeros_like(data)
>>> result[:-npoints, :] = csdata[npoints:, :] - csdata[:-npoints, :]
result
是图片中每个cumdata[i+npoints, j] - cumdata[i, j]
的{{1}}矢量化。它会在最后i, j
行填充零。如果您想阻止这种情况,可以npoints
与reflect
的边界。
对于非离散间隔,您可以使用插值:
np.pad
以上在>>> from scipy.interpolate import interp2d
>>> C = 0.5 # to interpolate every npoints+C pixels
>>> y, x = np.mgrid[:data.shape[0], :data.shape[1]]
>>> ynew, xnew = np.mgrid[C:data.shape[0]+C, :data.shape[1]]
>>> f = interp2d(x, y, csdata)
>>> csnew = f(xnew, ynew)
方向上移动了规则的网格C
像素,并在这些点处插入了累积数据y
(实际上,它为每个像素进行矢量插值)。
然后csdata
长度的积分可以作为
npoints+C
请注意,上限现在为>>> npoints = 6
>>> result = np.zeros_like(data)
>>> result[:-npoints, :] = csnew[npoints:, :] - csdata[:-npoints, :]
(6的实际转换为6.5元素),使其在实践中每6.5点整合一次。
然后您可以找到最大点
csnew