我有一个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值。行只能是捐赠者"或者"收件人",而不是两者。
到目前为止,我已经设置了这个方法,我有一个1D数组标记某些行为"捐赠者",例如
`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]]
希望这是有道理的。如果解决方案涉及以不同/更好的方式表示应该从一行转移到另一行的信息,那就完全没问题了。
答案 0 :(得分:0)
一种方法假设A
为2D输入数组 -
A[recips[:,None],positions_to_overwrite] = A[donors[:,None],positions_to_overwrite]
一些解释:positions_to_overwrite
的每一行代表donors
和recips
的列索引。现在,donors
和recips
都表示要操作的行索引。因此,我们需要将donors
和recips
都转换为列向量,以便它们的每个元素都对应positions_to_overwrite
的每一行。这有点像“广播”,但用于索引目的。