【发布时间】:2017-10-28 12:46:12
【问题描述】:
我有一个初始为零的 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是否总是被初始化为零? -
@StefanPochmann 很抱歉造成混乱。我忘了提到
I forget to mention that if there is a pair (i, j) in some array, I want to set v[i, j] and v[j, i] at the same time.。编辑了。 -
@Divakar 性能方面我认为没有什么能比这更好,但我很想知道这是否可能。是的,在我的情况下,
v始终初始化为 0。 -
那么,不如“更干净/更短”?
-
@Divakar 是的,一种更“numpaic”的方式......正如他们所说:-) 另外,如果你告诉我这是不可能的,我相信你,因为如果任何人都知道足以说,那就是你......这将构成一个有效的答案;-)
标签: python arrays numpy indexing