如何同时交换两个NumPy矩阵指定起始位置的若干行数据?
能否同时对多个矩阵的部分行执行交换操作
完全可以,基于NumPy的切片索引特性,只需要简单的临时值缓存逻辑就能实现,不需要额外依赖复杂工具。
场景示例
给定两个NumPy矩阵初始定义:
import numpy as np a = np.array([[1,2],[3,4],[5,6],[7,8]]) b = np.array([[9,10],[11,12],[13,14],[15,16]])
需求为从第三行(NumPy行索引从0开始计数,对应索引值为2)开始,交换两个矩阵的对应行,预期交换结果:
- 矩阵a:
np.array([[1,2],[3,4],[13,14],[15,16]]) - 矩阵b:
np.array([[9,10],[11,12],[5,6],[7,8]])
具体实现代码
核心逻辑是先缓存其中一个矩阵待交换区域的独立副本,避免赋值过程中原始数据被覆盖,再做交叉赋值:
# 先缓存a矩阵待交换行的独立副本,必须加.copy()生成独立数据,否则拿到的是原数组视图 temp = a[2:, :].copy() # 将b矩阵对应行赋值给a的目标区域 a[2:, :] = b[2:, :] # 将之前缓存的a原始行内容赋值给b的对应区域 b[2:, :] = temp
注意事项:如果省略.copy(),temp会指向原数组a对应切片的内存视图,当执行a[2:, :] = b[2:, :]修改a的内容时,temp的内容也会同步被修改,最终导致交换失败。
执行完上述代码后打印a、b即可得到预期结果:
# 打印a的输出 array([[ 1, 2], [ 3, 4], [13, 14], [15, 16]]) # 打印b的输出 array([[ 9, 10], [11, 12], [ 5, 6], [ 7, 8]])
如果需要对3个及以上的矩阵做同规则的部分行交换,沿用同样的缓存赋值逻辑即可实现。
内容的提问来源于stack exchange,提问作者alireza
相关产品推荐
相关产品推荐

