【问题标题】:Overwrite portions of some rows of a numpy array with portions of other rows用其他行的部分覆盖 numpy 数组的某些行的部分
【发布时间】:2015-05-25 16:46:36
【问题描述】:

我有一个 2d numpy 数组,例如:

[[1, 2, 3, 4, 5 ]
 [6, 7, 8, 9, 10]
 [11,12,13,14,15]
 [16,17,18,19,20]
 [21,22,23,24,25]
 [26,27,28,29,30]]

我想用其他行的一部分覆盖某些行的一部分。例如,我想用第 0 行的第 2 和第 3 值覆盖第 1 行的第 2 和第 3 值。行只能是“捐赠者”或“接受者”,不能同时是两者。

到目前为止,我设置的方式是一维数组,将某些行标记为“捐助者”,例如

`donors = np.array([0,2]) 

以及将某些行标记为收件人的一维数组,例如

`recips = np.array([1,3])

和一个指定要覆盖的位置的数组,例如

`positions_to_overwrite = np.array([2,3],[3,4]]) 

所以我想在这里发生的是第 1 行的第 2 和第 3 值(从零开始计数)被第 0 行的第 2 和第 3 值覆盖,第 3 行的第 3 和第 4 值被覆盖通过第 2 行的第 3 和第 4 个值。这会给我:

[[1, 2, 3, 4, 5 ]
 [6, 7, 3, 4, 10]
 [11,12,13,14,15]
 [16,17,18,14,15]
 [21,22,23,24,25]
 [26,27,28,29,30]]

希望这是有道理的。如果解决方案涉及以不同/更好的方式表示有关应该从一行传输到另一行的信息,那完全没问题。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    一种方法假设 A 作为 2D 输入数组 -

    A[recips[:,None],positions_to_overwrite] = A[donors[:,None],positions_to_overwrite]
    

    一点解释:positions_to_overwrite的每一行代表donorsrecips的列索引。现在,donorsrecips 都表示要操作的行索引。因此,我们需要将donorsrecips 都转换为列向量,以便它们的每个元素对应positions_to_overwrite 的每一行。这有点像“广播”,但用于索引目的。

    【讨论】:

    • 谢谢!我的尝试中缺少的是 '[:,None]' 部分。将一维数组转换为一列二维数组?
    • @BenS。添加了一些 cmets 来提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多