2016-12-16 80 views
3

我想交叉(在索引'x'处交换尾部)两个NumPy数组,以最少的计算和内存工作量。 目前,我做如下:有效地交叉两个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() 

有什么办法避免复制声明,无论是交叉进行就地做了什么?谢谢!

回答

4

使用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.])