设定在索引值与NumPy的
问题描述:
甲更合适的方法予有numpy的阵列开始用零,这样的:设定在索引值与NumPy的
v = np.zeros((5, 5))
v
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
我也有一组阵列和idx1
的idx2
。
idx1
array([[0, 3],
[0, 4],
[1, 3],
[2, 4]])
idx2
array([[0, 1],
[0, 2],
[0, 4],
[1, 3]])
查看每对值作为行和列索引。因此,例如,在idx1
中,第一对(0, 3)
将索引为v[0, 3]
等等。
我想先在由idx1
指定1
指标设定值,然后通过idx2
指定0
所有索引。
此外,请注意,如果某个阵列中有一对(i, j)
,我想同时设置v[i, j]
和v[j, i]
。
我的最终结果变成:
array([[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 1.],
[ 1., 0., 0., 0., 0.],
[ 0., 0., 1., 0., 0.]])
我目前做实现这一目标:
def set_vals(x, i, j, v):
x[i, j] = x.T[i, j] = v
v = np.zeros((5, 5))
i1, j1 = idx1[:, 0], idx1[:, 1]
i2, j2 = idx2[:, 0], idx2[:, 1]
set_vals(v, i1, j1, 1)
set_vals(v, i2, j2, 0)
v # the result
然而,我认为有可能是一个更好的办法。我很想听听任何有关改进的想法/建议。谢谢!
答
在寻找表达它更“紧凑”的方式,我得到了这一点 -
v = np.zeros((5, 5))
v[tuple(np.r_[idx1,idx1[:,::-1]].T)] = 1
v[tuple(np.r_[idx2,idx2[:,::-1]].T)] = 0
在python3.6 +,你可以使用*
拆包经营者,以进一步降低此:
v[[*np.r_[idx1,idx1[:,::-1]].T]] = 1
v[[*np.r_[idx2,idx2[:,::-1]].T]] = 0
v
array([[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 1.],
[ 1., 0., 0., 0., 0.],
[ 0., 0., 1., 0., 0.]])
+0
作出一个小编辑给你的答案,希望没关系!你的答案正是我需要的。 –
+0
@cᴏʟᴅsᴘᴇᴇᴅ它需要。谢谢! – Divakar
您是否在寻求改进性能? 'v'总会被初始化为零? – Divakar
@StefanPochmann对此感到抱歉。我忽略提及'我忘记提及如果在某个数组中有一对(i,j),我想同时设置v [i,j]和v [j,i]。编辑,在 –
@Divakar表现明智,我不认为任何事情都可以打败这一点,但我很想知道是否有可能。是的,在我的情况下,'v'总是被初始化为0。 –