首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提取2d numpy数组的随机2d窗口

提取2d numpy数组的随机2d窗口
EN

Stack Overflow用户
提问于 2018-10-04 08:13:23
回答 2查看 272关注 0票数 2
代码语言:javascript
复制
import numpy as np
arr = np.array(range(60)).reshape(6,10)

arr

> array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
>        [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
>        [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
>        [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
>        [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
>        [50, 51, 52, 53, 54, 55, 56, 57, 58, 59]])

我需要的是:

代码语言:javascript
复制
select_random_windows(arr, number_of windows= 3, window_size=3)



>  array([[[ 1,  2,  3],
>            [11, 12, 13],
>            [21, 22, 23]],
>            
>            [37, 38, 39],
>            [47, 48, 49],
>            [57, 58, 59]],
>           
>            [31, 32, 33],
>            [41, 42, 43],
>            [51, 52, 53]]])

在这个假设的情况下,我在主数组(arr)中选择了3个3x3窗口。

我的实际数组是一个光栅,我基本上需要一堆(数千)小3x3窗口。

任何帮助,甚至暗示都将是非常感谢的。

我实际上已经很多小时没有找到任何实用的yet...since解决方案了

太棒了!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-04 08:26:33

我们可以利用基于np.lib.stride_tricks.as_stridedscikit-image's view_as_windows来获得滑动窗口。view_as_windows

代码语言:javascript
复制
from skimage.util.shape import view_as_windows

def select_random_windows(arr, number_of_windows, window_size):
    # Get sliding windows
    w = view_as_windows(arr,window_size)

    # Store shape info
    m,n =  w.shape[:2]

    # Get random row, col indices for indexing into windows array
    lidx = np.random.choice(m*n,number_of_windows,replace=False)
    r,c = np.unravel_index(lidx,(m,n))
    # If duplicate windows are allowed, use replace=True or np.random.randint

    # Finally index into windows and return output
    return w[r,c]

样本运行-

代码语言:javascript
复制
In [209]: arr
Out[209]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
       [50, 51, 52, 53, 54, 55, 56, 57, 58, 59]])

In [210]: np.random.seed(0)

In [211]: select_random_windows(arr, number_of_windows=3, window_size=(2,4))
Out[211]: 
array([[[41, 42, 43, 44],
        [51, 52, 53, 54]],

       [[26, 27, 28, 29],
        [36, 37, 38, 39]],

       [[22, 23, 24, 25],
        [32, 33, 34, 35]]])
票数 3
EN

Stack Overflow用户

发布于 2018-10-04 08:27:11

你可以试试[numpy.random.choice()][1]。它需要一个一维或一个ndarray,并通过从给定的ndarray中采样元素来创建一个元素或一个ndarray。您还可以选择提供所需数组的大小作为输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52642035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档