2017-10-28 92 views
1

甲更合适的方法予有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.]]) 

我也有一组阵列和idx1idx2

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 

然而,我认为有可能是一个更好的办法。我很想听听任何有关改进的想法/建议。谢谢!

+0

您是否在寻求改进性能? 'v'总会被初始化为零? – Divakar

+0

@StefanPochmann对此感到抱歉。我忽略提及'我忘记提及如果在某个数组中有一对(i,j),我想同时设置v [i,j]和v [j,i]。编辑,在 –

+0

@Divakar表现明智,我不认为任何事情都可以打败这一点,但我很想知道是否有可能。是的,在我的情况下,'v'总是被初始化为0。 –

回答

1

在寻找表达它更“紧凑”的方式,我得到了这一点 -

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