使用NumPy设置索引值的更简洁的方法

2024-09-25 12:24:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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]的索引器,依此类推。你知道吗

我想首先在idx11指定的索引处设置值,然后在idx20指定的所有索引处设置值。你知道吗

另外,请注意,如果在某个数组中有一对(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

不过,我相信有更好的办法。希望听到任何改进的想法/建议。谢谢!你知道吗


Tags: numpynpzeros数组array行和列setj1
1条回答
网友
1楼 · 发布于 2024-09-25 12:24:26

为了寻找更“紧凑”的表达方式,我得到了这个-

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.]])

相关问题 更多 >