假设我有一个数组
[[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
答案 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