【问题标题】:Update 2D numpy array using pairs of indices without iteration使用索引对更新 2D numpy 数组,无需迭代
【发布时间】:2021-11-12 10:53:28
【问题描述】:

可重复设置

我有一个 n 对索引的数组:

indexarray=\
np.array([[0,2,4,6],
          [1,3,5,7]])

我还有一个二维数组:

zeros = np.zeros((10,9))

n 个值的列表:

values = [1,2,3,4]

我想将values 列表中的每个第 k 个元素添加到 zeros 列表中的索引等于第 k 个索引对的元素

解决方案

# works, but for loop is not suitable for real-world use-case
for index, (row, col) in enumerate(indexarray.T):
    zeros[row, col] = values[index]

想象一下我得到了什么:

plt.imshow(zeros)

结果符合预期。

如何在没有迭代的情况下做到这一点?


类似但不同的问题:

【问题讨论】:

  • rows, cols = indexarray[0], indexarray[1]; zeros[rows, cols] = values?
  • 哇,真不敢相信我错过了 :) 谢谢!
  • 你会重复索引吗?你需要把它们加在一起吗?
  • 我个人不需要,但未来的用户可能会发现这个问题;如果您愿意,也可以随意添加涵盖该案例的答案 - 我手头的问题已解决。

标签: python numpy


【解决方案1】:

简单使用:

import numpy as np

indexarray = np.array([[0, 2, 4, 6],
                       [1, 3, 5, 7]])
values = [1, 2, 3, 4]

rows, cols = indexarray[0], indexarray[1]

zeros = np.zeros((10, 9))
zeros[rows, cols] = values

print(zeros)

输出

[[0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 2. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 3. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 4. 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. 0. 0. 0.]]

将重复坐标加在一起的另一种方法是使用add.at

np.add.at(zeros, (rows, cols), values)

第二种选择是使用稀疏矩阵构造函数,例如:

from scipy.sparse import csr_matrix
rows, cols = indexarray[0], indexarray[1]
zeros = csr_matrix((values, (rows, cols)), shape=(10, 9)).toarray()

输出

[[0 1 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 2 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 3 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 4 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 0 0 0]]

【讨论】:

    【解决方案2】:

    您可以在索引中直接使用indexarray

    r, c = indexarray
    zeros[r, c] = values
    

    【讨论】:

      【解决方案3】:

      你可以简单地使用:

      zeros[indexarray[0], indexarray[1]] = values
      

      【讨论】:

        猜你喜欢
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 2019-12-23
        • 2020-03-29
        • 2022-07-08
        相关资源
        最近更新 更多