【问题标题】:Speed up numpy integer-array indexing for depth加快 numpy 整数数组索引的深度
【发布时间】:2018-04-25 12:35:51
【问题描述】:

假设我有一个数组

 [[0 2 1]
  [1 0 1]
  [2 1 1]]

我想把它转换成张量的形式

[[[1 0 0]
  [0 1 0]
  [0 0 0]]
 [[0 0 1]
  [1 0 1]
  [0 1 1]]
 [[0 1 0]
  [0 0 0]
  [1 0 0]]]

每个深度层(索引i)是一个二进制掩码,显示i 在输入中出现的位置。

我为此编写了代码,它可以正常工作,但速度太慢,无法使用。我可以用另一个向量化操作替换这个函数中的循环吗?

def im2segmap(im, depth):
    tensor = np.zeros((im.shape[0], im.shape[1], num_classes))

    for c in range(depth):
        rows, cols = np.argwhere(im==c).T
        tensor[c, rows, cols] = 1

    return tensor

【问题讨论】:

    标签: python numpy vectorization


    【解决方案1】:

    使用broadcasting -

    (a==np.arange(num_classes)[:,None,None]).astype(int)
    

    或者与builtin外比较-

    (np.equal.outer(range(num_classes),a)).astype(int)
    

    如果您必须使用int dtype,请使用uint8,或者通过完全跳过int 转换以保持boolean 以进一步提升。

    示例运行 -

    In [42]: a = np.array([[0,2,1],[1,0,1],[2,1,1]])
    
    In [43]: num_classes = 3 # or depth
    
    In [44]: (a==np.arange(num_classes)[:,None,None]).astype(int)
    Out[44]: 
    array([[[1, 0, 0],
            [0, 1, 0],
            [0, 0, 0]],
    
           [[0, 0, 1],
            [1, 0, 1],
            [0, 1, 1]],
    
           [[0, 1, 0],
            [0, 0, 0],
            [1, 0, 0]]])
    

    要将depth/num_classes 作为第三个暗淡,扩展输入数组,然后与范围数组进行比较 -

    (a[...,None]==np.arange(num_classes)).astype(int)
    (np.equal.outer(im, range(num_classes))).astype(int)
    (np.equal.outer(im, range(num_classes))).astype(np.uint8) # lower prec
    

    【讨论】:

    • 这真的很酷。如何对其进行编辑以将深度输出为第三维? (x,y,depth) 而不是 (depth,x,y)。我尝试了几件事,但没有广播。
    • @RabeezRiaz 那会是:a[...,None]==np.arange(num_classes)
    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2021-12-11
    相关资源
    最近更新 更多