加快numpy整数数组索引的深度

时间:2018-04-25 12:35:51

标签: python numpy vectorization

假设我有一个数组

 [[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

1 个答案:

答案 0 :(得分:5)

使用broadcasting -

entry.CopyTo(new DirectoryEntry("LDAP://OU=Users,DC=Domain,DC=local"), "NewUserName");

(a==np.arange(num_classes)[:,None,None]).astype(int) 外部比较 -

builtin

如果您必须使用(np.equal.outer(range(num_classes),a)).astype(int) dtype,请使用uint8,或通过完全跳过int转换来保持boolean以进一步提升。

示例运行 -

int

要将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]]]) 作为第三个dim,扩展输入数组,然后与范围数组进行比较 -

depth/num_classes