首先,这是我想做的一维模拟。
假设我有一个0s的1d数组,并且我想将索引2以后的每个0替换为1。我可以这样做,如下所示:
import numpy as np
x = np.array([0,0,0,0])
i = 2
x[i:] = 1
print(x) # [0 0 1 1]
现在,我试图找出此操作的2d版本。首先,我有一个5x4的0数组,例如
foo = np.zeros(shape = (5,4))
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
和相应的5元素的列索引数组,例如
fill_locs = np.array([0, 3, 1, 1, 2])
对于foo的每一行,我想i:
用1s填充列,其中i
是给出的索引fill_locs
。foo[fill_locs.reshape(-1, 1):] = 1
感觉不错,但是不起作用。
我想要的输出应该像
expected_result = np.array([
[1, 1, 1, 1],
[0, 0, 0, 1],
[0, 1, 1, 1],
[0, 1, 1, 1],
[0, 0, 1, 1],
])
您不需要切片,也不需要创建原始数组。您可以通过广播比较完成所有这些操作。
a = np.array([0, 3, 1, 1, 2])
n = 4
(a[:, None] <= np.arange(n)).view('i1')
array([[1, 1, 1, 1],
[0, 0, 0, 1],
[0, 1, 1, 1],
[0, 1, 1, 1],
[0, 0, 1, 1]], dtype=int8)
或使用 less_equal.outer
np.less_equal.outer(a, np.arange(n)).view('i1')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句