我有2个numpy数组output
和index
:
output = np.zeros((3,3,3))
>>>index
array([[0,1,2],
[1,0,0],
[2,2,2]])
index
表示应使用第一维中的output
填充output
的索引。填充的>>>output
array([[[1, 1, 1],
[1, 1, 1],
[1, 1, 1]],
[[0, 1, 1],
[1, 0, 0],
[1, 1, 1]],
[[0, 0, 1],
[0, 0, 0],
[1, 1, 1]]]
值应如下所示:
index[0, 1] == 1
例如,自output[:1+1, 0, 1] = 1
以来,我们设置了index[i, j] == k
。一般来说,如果output[:k+1, i, j] = 1
,我们会设置{{1}}。
有谁知道如何以矢量化方式实现这一目标?
答案 0 :(得分:2)
使用NumPy broadcasting
,我们可以创建这些地方的掩码。因此,只需将该掩码转换为0s
和1s
的int数组,就像这样 -
(index >= np.arange(3)[:,None,None]).astype(int)
示例运行 -
In [471]: index
Out[471]:
array([[0, 1, 2],
[1, 0, 0],
[2, 2, 2]])
In [472]: (index >= np.arange(3)[:,None,None]).astype(int)
Out[472]:
array([[[1, 1, 1],
[1, 1, 1],
[1, 1, 1]],
[[0, 1, 1],
[1, 0, 0],
[1, 1, 1]],
[[0, 0, 1],
[0, 0, 0],
[1, 1, 1]]])
或者,要分配到output
,请使用boolean-indexing
的掩码并指定1s
-
output[index >= np.arange(output.shape[0])[:,None,None]] = 1
答案 1 :(得分:0)
您可以将1
分配到最后一个位置(沿第一个维度),然后使用np.maximum.accumulate
将0填充为0:
output[index, np.arange(output.shape[1])[:,None], np.arange(output.shape[2])] = 1
np.maximum.accumulate(output[::-1], axis=0)[::-1]
#array([[[ 1., 1., 1.],
# [ 1., 1., 1.],
# [ 1., 1., 1.]],
# [[ 0., 1., 1.],
# [ 1., 0., 0.],
# [ 1., 1., 1.]],
# [[ 0., 0., 1.],
# [ 0., 0., 0.],
# [ 1., 1., 1.]]])