2017-10-28 46 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