假设我有一个N×N矩阵M和一个N元素数组A.A [i]表示M中的M [i,A [i]]条目。如何快速将M中的相应条目设置为给定值1数组A?
到目前为止使用numpy,我尝试的是: M [0:A.shape [0],A] = 1 但这不起作用,我不想遇到一个循环,当N很大时,这种循环很有用。
答案 0 :(得分:0)
您可以创建一个遮罩,而不是用它来将所有值设置为1.在这种情况下(对于4x4矩阵和A = [1,3,2,0]),可以通过以下方式创建遮罩:< / p>
A = np.array([1, 3, 2, 0])
mask = np.zeros((4, 4), int)
np.fill_diagonal(mask, 1)
mask = mask[A, :] > 0
哪个会产生面具:
[[False True False False]
[False False False True]
[False False True False]
[ True False False False]]
然后,您可以轻松地将蒙版应用于4x4矩阵M
,并将相应的值设置为1.
np.random.seed(42)
M = np.random.uniform(0, 1, 16).reshape(4, 4)
M[mask] = 1
结果是:
[[ 0.37454012 1. 0.73199394 0.59865848]
[ 0.15601864 0.15599452 0.05808361 1. ]
[ 0.60111501 0.70807258 1. 0.96990985]
[ 1. 0.21233911 0.18182497 0.18340451
或者你可以用一个简单的for循环来实现它,它实际上产生相同的。
A = np.array([1, 3, 2, 0])
np.random.seed(42)
M = np.random.uniform(0, 1, 16).reshape(4, 4)
M[mask] = 1
for i, a in enumerate(A):
M[i, a] = 1