我想交叉(在索引'x'处交换尾部)两个NumPy数组,计算和内存工作量最少。 目前我这样做:
import numpy as np
a1 = np.zeros(10)
a2 = np.ones(10)
x = np.random.randint(1, a1.size)
a1[:x], a2[:x] = a2[:x].copy(), a1[:x].copy()
有没有办法避免复制声明,无论交叉是否就地完成?谢谢!
答案 0 :(得分:5)
使用tmp
变量保存一个copying
-
tmp = a2[:x].copy()
a2[:x], a1[:x] = a1[:x], tmp
示例运行 -
1)开始时(分配前):
In [322]: a1
Out[322]: array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [323]: a2
Out[323]: array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
In [324]: x
Out[324]: 4
2)提议的代码:
In [325]: tmp = a2[:x].copy()
...: a2[:x], a1[:x] = a1[:x], tmp
...:
3)验证结果:
In [326]: a1
Out[326]: array([ 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.])
In [327]: a2
Out[327]: array([ 0., 0., 0., 0., 1., 1., 1., 1., 1., 1.])