当前位置: 首页 > 面试题库 >

NumPy花式索引-从不同渠道收获不同的投资回报率

厍书
2023-03-14
问题内容

假设我们有以下numpy 4D数组(3x1x4x4):

import numpy as np
n, c, h, w = 3, 1, 4, 4

data = np.arange(n * c * h * w).reshape(n, c, h, w)

>>> 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]]]])

现在我想将n个子数组中的每个子数组裁剪到具有相同大小的不同位置:

size = 2
locations = np.array([
    [0, 1],
    [1, 1],
    [0, 2]
])

执行此操作的缓慢方法如下:

crops = np.stack([d[:, y:y+size, x:x+size] 
     for d, (y,x) in zip(data, locations)])

>>> array([[[[ 1,  2],
             [ 5,  6]]],

           [[[21, 22],
             [25, 26]]],

           [[[34, 35],
             [38, 39]]]])

现在,我正在寻找一种通过numpy的精美索引来实现此目标的方法。我已经花了几个小时弄清楚如何解决这个问题。我是否忽略了解决此问题的简单方法?有一些numpy索引专家,谁可以帮助我?


问题答案:

我们可以扩展this solution你的3D情况下,通过利用
np.lib.stride_tricks.as_strided基于sliding- windowed views高效的补丁提取,像这样-

from skimage.util.shape import view_as_windows

def get_patches(data, locations, size):
    # Get 2D sliding windows for each element off data
    w = view_as_windows(data, (1,1,size,size))

    # Use fancy/advanced indexing to select the required ones
    return w[np.arange(len(locations)), :, locations[:,0], locations[:,1]][:,:,0,0]

我们需要将它们1,1作为to的窗口参数view_as_windows,因为它希望窗口具有与输入数据的暗淡数量相同的元素数量。我们沿的最后两个轴滑动data,因此使前两个保持不变1s,基本上不沿的前两个轴滑动data

样本运行于一个通道,而不只是通道数据-

In [78]: n, c, h, w = 3, 1, 4, 4 # number of channels = 1
    ...: data = np.arange(n * c * h * w).reshape(n, c, h, w)
    ...: 
    ...: size = 2
    ...: locations = np.array([
    ...:     [0, 1],
    ...:     [1, 1],
    ...:     [0, 2]
    ...: ])
    ...: 
    ...: crops = np.stack([d[:, y:y+size, x:x+size] 
    ...:      for d, (y,x) in zip(data, locations)])

In [79]: print np.allclose(get_patches(data, locations, size), crops)
True

In [80]: n, c, h, w = 3, 5, 4, 4 # number of channels = 5
    ...: data = np.arange(n * c * h * w).reshape(n, c, h, w)
    ...: 
    ...: size = 2
    ...: locations = np.array([
    ...:     [0, 1],
    ...:     [1, 1],
    ...:     [0, 2]
    ...: ])
    ...: 
    ...: crops = np.stack([d[:, y:y+size, x:x+size] 
    ...:      for d, (y,x) in zip(data, locations)])

In [81]: print np.allclose(get_patches(data, locations, size), crops)
True

标杆管理

其他方法-

# Original soln
def stack(data, locations, size):
    crops = np.stack([d[:, y:y+size, x:x+size] 
         for d, (y,x) in zip(data, locations)])    
    return crops

# scholi's soln
def allocate_assign(data, locations, size):
    n, c, h, w = data.shape
    crops = np.zeros((n,c,size,size))
    for i, (y,x) in enumerate(locations):
        crops[i,0,:,:] = data[i,0,y:y+size,x:x+size]
    return crops

从评论来看,OP似乎对具有shape数据(512,1,60,60)sizeas的情况感兴趣12,24,48。因此,让我们使用一个函数为它们设置数据-

# Setup data
def create_inputs(size):
    np.random.seed(0)
    n, c, h, w = 512, 1, 60, 60
    data = np.arange(n * c * h * w).reshape(n, c, h, w)
    locations = np.random.randint(0,3,(n,2))
    return data, locations, size

时间-

In [186]: data, locations, size = create_inputs(size=12)

In [187]: %timeit stack(data, locations, size)
     ...: %timeit allocate_assign(data, locations, size)
     ...: %timeit get_patches(data, locations, size)
1000 loops, best of 3: 1.26 ms per loop
1000 loops, best of 3: 1.06 ms per loop
10000 loops, best of 3: 124 µs per loop

In [188]: data, locations, size = create_inputs(size=24)

In [189]: %timeit stack(data, locations, size)
     ...: %timeit allocate_assign(data, locations, size)
     ...: %timeit get_patches(data, locations, size)
1000 loops, best of 3: 1.66 ms per loop
1000 loops, best of 3: 1.55 ms per loop
1000 loops, best of 3: 470 µs per loop

In [190]: data, locations, size = create_inputs(size=48)

In [191]: %timeit stack(data, locations, size)
     ...: %timeit allocate_assign(data, locations, size)
     ...: %timeit get_patches(data, locations, size)
100 loops, best of 3: 2.8 ms per loop
100 loops, best of 3: 3.33 ms per loop
1000 loops, best of 3: 1.45 ms per loop


 类似资料:
  • 市场人员可以将会议活动的报名链接、二维码或者邀请海报投放到媒体广告或官网进行会议活动的宣传造势; 1. 获取会议对应渠道的二维码或链接 2. 获取报名表单的二维码与链接 在会议主页与报名表单处,选择渠道并在此可获得对应渠道的报名表单的二维码、链接与官网的嵌入代码;

  • 我需要我的discord机器人记住在不同的行会中向哪个频道发送问候。目前,我将频道名称作为前缀,并使用它来回忆发送到何处: 我如何设置一个命令,当机器人加入他们的公会时,所有者可以使用该命令,为每个公会设置一个唯一的欢迎通道(并且显然只向加入公会的人发送欢迎消息)。 哦,我如何设置一个命令,最终让人们改变他们公会的欢迎信息? 谢谢!:)

  • 我很难理解RabbitMQ的基本概念。我发现在线文档并不十分清楚。 到目前为止,我理解了什么是通道、队列、绑定等。 但如何实现以下用例: 用例:发件人以不同的主题发布到一个交易所。在接收者方面,根据主题,应该通知不同的接收者。 因此,通过主题交换,以下内容应该是可行的: 创建频道 我的困难在于回调与通道相关,而与队列或队列绑定无关。我不能百分之百确定我是否在这里。 这就是我的问题:为了有多个回调,

  • 问题内容: 我设置了logstash以使用嵌入式elastisearch。 我可以记录事件。 我的logstashconf看起来是这样的:https://gist.github.com/khebbie/42d72d212cf3727a03a0 现在,我想添加另一个udp输入,并在另一个索引中对该输入进行索引。 有可能吗?我这样做是为了使报告更加容易,因此我可以在一个索引中包含系统日志事件,而在另一

  • 问题内容: 说我有一个数组 np.zeros((4,2)) 我有一个值[4,3,2,1]的列表,我想分配给以下位置:[(0,0),(1,1),(2,1),(3,0) ] 如何不使用for循环或展平数组来做到这一点? 我可以使用花哨的索引来检索值,但不能分配它们。 ======更新========= 感谢@hpaulj,我意识到原始代码中的错误是。 当我使用zeros_like初始化数组时,它默认为

  • 在为存储在本地数据库中的数据实现搜索功能时,您将如何处理? > 每次用户输入 桌子上有200-300行。每行包含10-15列。 附言:我总是对缓存的列表执行过滤,主要是因为无论如何我都需要显示完整的列表,所以整个数据集已经被预取了。 让我们假设您不必首先显示整个列表,并且只在用户开始键入时显示,在这种情况下执行数据库查询总体上更好吗? 我只是不确定。我看见一位同事在做询问。 是的,我懒得测试数据库