Python numpy:将多个切片组装到新阵列中

Python numpy:将多个切片组装到新阵列中,python,numpy,slice,Python,Numpy,Slice,我有一个二维数组,我需要将其中的部分(切片)提取到一个新数组中: original= numpy.ndarray( shape=(4,4) ) slices= numpy.ndarray( shape=(0,2) ) for x in range(3): slice= original[x:x+2,x:x+2] slices=numpy.append(slices, slice,axis=0) 有没有更有效的方法来实现这一点(摆脱python for cycle) ----编

我有一个二维数组,我需要将其中的部分(切片)提取到一个新数组中:

original= numpy.ndarray( shape=(4,4) )
slices= numpy.ndarray( shape=(0,2) )
for x in range(3):
    slice= original[x:x+2,x:x+2] 
    slices=numpy.append(slices, slice,axis=0)
有没有更有效的方法来实现这一点(摆脱python for cycle)

----编辑---

为了澄清,我想问的是如何将任意(但类似)形状的2D切片从2D数组的任意2D索引复制到另一个垂直堆叠的2D数组中,而不是特别沿着对角线或2x2大小。以下是您的解决方案:

v = np.arange(0,original.shape[0],0.5).astype(int)
result = np.c_[ original[v[1:-1],v[:-2]] , original[v[1:-1],v[2:]] ]
适用于任何大小的方形输入矩阵(您称之为“原始”)

其思想是创建一个“助手数组”v,它简单地是[0,0,1,1,2,2,3,3,…],然后使用观察结果,即您需要的索引始终是v的简单切片


享受吧

有一个非常好的技巧,其中包含
跨步技巧
,您可以在SO和other上找到具有不同通用性的滚动窗口函数(目前在numpy本身中没有),下面是一个根据您获得的功能定制的版本:

def rolling_window(arr, window):
    """Very basic multi dimensional rolling window. window should be the shape of
    of the desired subarrays. Window is either a scalar or a tuple of same size
    as `arr.shape`.
    """
    shape = np.array(arr.shape*2)
    strides = np.array(arr.strides*2)
    window = np.asarray(window)
    shape[arr.ndim:] = window # new dimensions size
    shape[:arr.ndim] -= window - 1
    if np.any(shape < 1):
        raise ValueError('window size is too large')
    return np.lib.stride_tricks.as_strided(arr, shape=shape, strides=strides)

# Now:
view = rolling_window(arr, 2)
view[0,0] # first slice in your loop
现在,
diagonal
是您在for循环中创建的数组(在较新版本中,如果不需要视图,请添加一个
.copy()

编辑:由于追加,因此
切片
阵列是二维而非三维的,因此此处缺少重塑:

slices = diagonal.reshape(-1,2)

如果你有这么小的数组,这可能不会更快,但它的常数(除了在
对角线
调用中复制数据)与数组大小有关。

我仍在试图理解第二行的曲折。。。有没有办法在任意切片大小(不一定是2x2)上执行此操作?对于任意的切片位置,不一定沿着对角线。@goncalopp任意的正方形切片大小应该是一个简单的扩展。任意位置可能更复杂-底线是,您可以使用索引来获取切片,您只需要列出正确的顺序。在任何情况下,你的问题都非常具体,不清楚你想概括哪些变量,所以如果你想具体一些,请把它放在问题中。如果我正确理解了你的方法,提取n*n大小的切片需要n个np.c_2;参数?我编辑了这个问题以进行澄清这简化了索引,但是如果不将for与numpy.append一起使用,如何使用它来实现最终数组(“问题中的切片”)?@goncalopp抱歉,我没有注意到在添加时您正在删除一维。不过,这只是一个重塑。补充说,虽然可能有点烦人。我不确定你到底想要什么,但视图可以帮助你获得切片,从那里我想这取决于…很好!有没有办法将其推广到任意索引(不一定是对角线索引)?(请参见问题编辑)@goncalopp我猜只是w
视图
数组上的任何(奇特的)索引,或者重塑的
视图
数组……切片必须是方形的吗?@Bitwise“任意(但类似)成形的2D切片”,因此,不一定是方形的
slices = diagonal.reshape(-1,2)