使用numpy`as

编程入门 行业动态 更新时间:2024-10-21 20:42:40
本文介绍了使用numpy`as_strided`函数创建任意尺寸的补丁,图块,滚动或滑动窗口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

今天早上花了一段时间寻找通用问题,将重复问题指向关于 as_strided 和/或如何制作通用窗口函数.似乎有很多问题关于如何(安全)在阵列上创建补丁,滑动窗口,滚动窗口,图块或视图以进行机器学习,卷积,图像处理和/或数值积分.

Spent a while this morning looking for a generalized question to point duplicates to for questions about as_strided and/or how to make generalized window functions. There seem to be a lot of questions on how to (safely) create patches, sliding windows, rolling windows, tiles, or views onto an array for machine learning, convolution, image processing and/or numerical integration.

我正在寻找可以接受window,step和axis参数并返回任意尺寸的as_strided视图的通用函数.我将在下面给出答案,但是我很想知道是否有人可以做一个更有效的方法,因为我不确定使用np.squeeze()是最好的方法,也不知道我的assert语句是否会使函数安全足以写入结果视图,而且我不确定如何处理axis不按升序排列的情况.

I'm looking for a generalized function that can accept a window, step and axis parameter and return an as_strided view for over arbitrary dimensions. I will give my answer below, but I'm interested if anyone can make a more efficient method, as I'm not sure using np.squeeze() is the best method, I'm not sure my assert statements make the function safe enough to write to the resulting view, and I'm not sure how to handle the edge case of axis not being in ascending order.

尽职调查

我能找到的最通用的函数是 sklearn.feature_extraction.image.extract_patches 由@eickenberg(以及显然等效的 skimage.util.view_as_windows ),但是这些文件在网络上的记录不充分,并且不能在比原始数组中的轴数更少的轴上进行窗口(例如,这个问题要求一个窗口在一个轴上具有一定的尺寸).同样,问题通常只需要numpy答案.

The most generalized function I can find is sklearn.feature_extraction.image.extract_patches written by @eickenberg (as well as the apparently equivalent skimage.util.view_as_windows), but those are not well documented on the net, and can't do windows over fewer axes than there are in the original array (for example, this question asks for a window of a certain size over just one axis). Also often questions want a numpy only answer.

@Divakar为1维输入,但需要更多的注意.我在 3D输入法上的2D窗口上做了一个空洞的骨头,但扩展性不是很好.

@Divakar created a generalized numpy function for 1-d inputs here, but higher-dimension inputs require a bit more care. I've made a bare bones 2D window over 3d input method, but it's not very extensible.

推荐答案

EDIT JAN 2020 :将可迭代的返回值从列表更改为生成器以节省内存.

EDIT JAN 2020: Changed the iterable return from a list to a generator to save memory.

这是我到目前为止的食谱:

Here's the recipe I have so far:

def window_nd(a, window, steps = None, axis = None, generator = False): """ Create a windowed view over `n`-dimensional input that uses an `m`-dimensional window, with `m <= n` Parameters ------------- a : Array-like The array to create the view on window : tuple or int If int, the size of the window in `axis`, or in all dimensions if `axis == None` If tuple, the shape of the desired window. `window.size` must be: equal to `len(axis)` if `axis != None`, else equal to `len(a.shape)`, or 1 steps : tuple, int or None The offset between consecutive windows in desired dimension If None, offset is one in all dimensions If int, the offset for all windows over `axis` If tuple, the steps along each `axis`. `len(steps)` must me equal to `len(axis)` axis : tuple, int or None The axes over which to apply the window If None, apply over all dimensions if tuple or int, the dimensions over which to apply the window generator : boolean Creates a generator over the windows If False, it will be an array with `a.nidim + 1 <= a_view.ndim <= a.ndim *2`. If True, generates one window per .next() call Returns ------- a_view : ndarray A windowed view on the input array `a`, or a generator over the windows """ ashp = np.array(a.shape) if axis != None: axs = np.array(axis, ndmin = 1) assert np.all(np.in1d(axs, np.arange(ashp.size))), "Axes out of range" else: axs = np.arange(ashp.size) window = np.array(window, ndmin = 1) assert (window.size == axs.size) | (window.size == 1), "Window dims and axes don't match" wshp = ashp.copy() wshp[axs] = window assert np.all(wshp <= ashp), "Window is bigger than input array in axes" stp = np.ones_like(ashp) if steps: steps = np.array(steps, ndmin = 1) assert np.all(steps > 0), "Only positive steps allowed" assert (steps.size == axs.size) | (steps.size == 1), "Steps and axes don't match" stp[axs] = steps astr = np.array(a.strides) shape = tuple((ashp - wshp) // stp + 1) + tuple(wshp) strides = tuple(astr * stp) + tuple(astr) as_strided = np.lib.stride_tricks.as_strided a_view = np.squeeze(as_strided(a, shape = shape, strides = strides)) if generator: for idx in np.ndindex(shape[:-wshp.size]): yield a_view[idx] else: return a_view

一些测试用例:

a = np.arange(1000).reshape(10,10,10) window_nd(a, 4).shape # sliding (4x4x4) window Out: (7, 7, 7, 4, 4, 4) window_nd(a, 2, 2).shape # (2x2x2) blocks Out: (5, 5, 5, 2, 2, 2) window_nd(a, 2, 1, 0).shape # sliding window of width 2 over axis 0 Out: (9, 2, 10, 10) window_nd(a, 2, 2, (0,1)).shape # tiled (2x2) windows over first and second axes Out: (5, 5, 2, 2, 10) window_nd(a,(4,3,2)).shape # arbitrary sliding window Out: (7, 8, 9, 4, 3, 2) window_nd(a,(4,3,2),(1,5,2),(0,2,1)).shape #arbitrary windows, steps and axis Out: (7, 5, 2, 4, 2, 3) # note shape[-3:] != window as axes are out of order

更多推荐

使用numpy`as

本文发布于:2023-11-28 20:58:57,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1643929.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:numpy

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!