【问题标题】:A neater way to set values at indexes with NumPy使用 NumPy 在索引处设置值的一种更简洁的方法
【发布时间】: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.]])

我还有一组数组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

但是,我相信可能有更好的方法。希望听到任何改进的想法/建议。谢谢!

【问题讨论】:

  • 您是否正在寻找提高性能的明智方法? 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


【解决方案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.]])

【讨论】:

  • 对您的答案进行了小修改,希望没问题!你的答案正是我所需要的。
  • @cᴏʟᴅsᴘᴇᴇᴅ 它需要那个。谢谢!
猜你喜欢
  • 2015-04-28
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 2020-10-20
  • 2021-01-11
  • 2017-03-27
相关资源
最近更新 更多