Python 如何仅使用numpy获取二维阵列的所有窗口?

Python 如何仅使用numpy获取二维阵列的所有窗口?,python,numpy,Python,Numpy,给定任意大小的2D数组(X+2*填充,Y+2*填充)和窗口大小W,生成的数组的形状应为(X,Y,W*W),(X,Y,W,W),(X*Y,W*W),(X*Y,W,W)。2D数组已具有0的边框填充。步幅总是1 例如(窗口大小为3时): 只要生成的数组由定义了窗口大小的所有窗口组成,我就可以使用上面描述的任何结果形状 仅使用numpy函数/功能(循环等不使用)是否可以实现这一点? 注意:X、Y和W应该是灵活的,解决方案不应该只适用于我的示例 这里的问题是:不包括窗口大小,建议的解决方案仅适用于问题中提

给定任意大小的2D数组(X+2*填充,Y+2*填充)和窗口大小W,生成的数组的形状应为(X,Y,W*W),(X,Y,W,W),(X*Y,W*W),(X*Y,W,W)。2D数组已具有0的边框填充。步幅总是1

例如(窗口大小为3时):

只要生成的数组由定义了窗口大小的所有窗口组成,我就可以使用上面描述的任何结果形状

仅使用numpy函数/功能(循环等不使用)是否可以实现这一点?

注意:X、Y和W应该是灵活的,解决方案不应该只适用于我的示例


这里的问题是:不包括窗口大小,建议的解决方案仅适用于问题中提供的非常特定的阵列形状,或者使用numpy提供的功能以外的其他功能。

在得到答案之前,要清楚,这是参考的滑动窗口问题的重复。您只需添加一个维度并考虑填充。考虑到你在这个网站上的排名,我认为你会阅读这个问题并浏览文档。很明显你没有那样做。请以后这样做

下面是解决您发布的示例的代码。我会让你来处理最终形状不同的情况

import numpy as np                                                                                   

a = np.array([[0, 0, 0, 0, 0, 0, 0, 0],                                                              
     [0, 1, 2, 3, 4, 5, 6, 0],                                                                       
     [0, 1, 2, 3, 4, 5, 6, 0],                                                                       
     [0, 1, 2, 3, 4, 5, 6, 0],                                                                       
     [0, 0, 0, 0, 0, 0, 0, 0]])                                                                      

def window_stack(x, stepsize=1, window=3, pad=1):                                                    
    m,n = x.shape                                                                                    
    res = np.array([[x[i:i+window:stepsize,j:j+window:stepsize] for j in range(n-window+1)] for i in\
 range(m-window+1)])                                                                                 
    m -= 2*pad                                                                                       
    n -= 2*pad                                                                                       
    return res.reshape(m*n,window*window)                                                            

res = window_stack(a)                                                                                

print "Original:"                                                                                    
print a                                                                                              
print                                                                                                
print "Result:"                                                                                      
print res

可能是@koPytok的复制品不是。链接问题答案中使用的操作仅适用于每行只有2个值的特定示例,并且不包括flexibel窗口大小。我要求的基本上是不同的。首先,你应该能够使用引用的副本并很容易地推广到你的案例中。第二,您指定输出应该是3D的,但没有一个示例是3D的。请把你的问题改写得更清楚。@David“重复”中的答案不适用于我的问题。它们不适合我的情况,因为它们不能解决我的情况。我的问题中所有的例子都是3D的。我不知道你为什么看不到这些。”…形状(X,Y,W*W),(X,Y,W,W),(X*Y,W*W),(X*Y,W,W),“其中一些是3D的,一个甚至是4D的。示例中的所有输出都是2D。感谢您的回答。但它没有回答我的问题。我要求一个numpy解决方案(没有任何其他方法,如for循环,…)。这就是为什么链接问题的这种解决方案不适用于我的问题。你说的是使用numpy,而不是完全使用numpy。如果您试图获得这种类型的性能,那么为什么不编写一些C,编译它,然后从Python调用它呢。您将避免使用python for循环,并获得所需的内容。我相信可以按照您指定的方式完成,但我必须在工作结束后再处理它。对于生产代码,您绝对正确。我只是想知道,在python中只使用numpy是否以及如何做到这一点。我首先尝试了链接答案中提到的位转移和索引技巧,但这并没有让我走多远,因此我想我会问社区是否有人知道如何做。如果你能找到一个解决方案并且非常有趣的话,那就太好了。这需要进行一些粗糙的numpy整形,但是是的。
import numpy as np                                                                                   

a = np.array([[0, 0, 0, 0, 0, 0, 0, 0],                                                              
     [0, 1, 2, 3, 4, 5, 6, 0],                                                                       
     [0, 1, 2, 3, 4, 5, 6, 0],                                                                       
     [0, 1, 2, 3, 4, 5, 6, 0],                                                                       
     [0, 0, 0, 0, 0, 0, 0, 0]])                                                                      

def window_stack(x, stepsize=1, window=3, pad=1):                                                    
    m,n = x.shape                                                                                    
    res = np.array([[x[i:i+window:stepsize,j:j+window:stepsize] for j in range(n-window+1)] for i in\
 range(m-window+1)])                                                                                 
    m -= 2*pad                                                                                       
    n -= 2*pad                                                                                       
    return res.reshape(m*n,window*window)                                                            

res = window_stack(a)                                                                                

print "Original:"                                                                                    
print a                                                                                              
print                                                                                                
print "Result:"                                                                                      
print res