我正在使用numpy 1.9来处理一组数组。假设我有类似的东西我有两个2D阵列A
和B
和一个1-d阵列C
,其看起来像这样:
>>> A
array([[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]])
>>> B
array([[-1., -1., -1., -1., -1.],
[-1., -1., -1., -1., -1.],
[-1., -1., -1., -1., -1.],
[-1., -1., -1., -1., -1.],
[-1., -1., -1., -1., -1.]])
>>> C
array([1, 3, 2, 4, 0])
我的目标是根据C的要求,在A中插入B的所有元素。更具体地说,如果位置0的C具有1,则B [0,1]应该插入A [0,1]之后。
这是预期的结果:
array([[ 1, 1, -1, 1, 1, 1],
[ 1, 1, 1, 1, -1, 1],
[ 1, 1, 1, -1, 1, 1],
[ 1, 1, 1, 1, 1, -1],
[ 1, -1, 1, 1, 1, 1]])
我试图像这样实现它,但是速度不是很快:
for i in xrange(size(C, 0)):
j = C[i]
A[i, :] = numpy.insert(A[i], j, B[i, j])
有没有办法使它更快?(使用单个numpy操作(例如遮罩或类似方法)进行操作)
讨厌的单线怎么样?
一,数据;数组的形状与您的数组相同,但是我使用整数使示例更易于阅读。
In [81]: A
Out[81]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
In [82]: B
Out[82]:
array([[ 0, 100, 200, 300, 400],
[ 500, 600, 700, 800, 900],
[1000, 1100, 1200, 1300, 1400],
[1500, 1600, 1700, 1800, 1900],
[2000, 2100, 2200, 2300, 2400]])
In [83]: C
Out[83]: array([1, 3, 2, 4, 0])
这是讨厌的一线客:
In [84]: np.insert(A.ravel(), np.ravel_multi_index((range(A.shape[0]), C), A.shape) + 1, B[range(B.shape[0]), C]).reshape(A.shape[0], A.shape[1]+1)
Out[84]:
array([[ 0, 1, 100, 2, 3, 4],
[ 5, 6, 7, 8, 800, 9],
[ 10, 11, 12, 1200, 13, 14],
[ 15, 16, 17, 18, 19, 1900],
[ 20, 2000, 21, 22, 23, 24]])
这是细分版本:
A.ravel()
展平A
为一维数组,我将其称为F
:
In [87]: F = A.ravel()
In [88]: F
Out[88]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24])
(编辑:事实证明,第一步-展平-A
不必要。正如@hpaulj在他的答案中指出的那样,np.insert
默认情况下将展平该数组。)
np.ravel_multi_index
用于将所需的2-d位置转换为索引到展平数组中。的+ 1
,因为你要插入的元素在年底是必要的后给出的指标C
:
In [89]: insert_indices = np.ravel_multi_index((range(A.shape[0]), C), A.shape) + 1
In [90]: insert_indices
Out[90]: array([ 2, 9, 13, 20, 21])
B[range(B.shape[0]), C]
从中拉出所需的值B
:
In [91]: values = B[range(B.shape[0]), C]
In [92]: values
Out[92]: array([ 100, 800, 1200, 1900, 2000])
np.insert
进行实际插入并创建一个新数组:
In [93]: np.insert(F, insert_indices, values)
Out[93]:
array([ 0, 1, 100, 2, 3, 4, 5, 6, 7, 8, 800,
9, 10, 11, 12, 1200, 13, 14, 15, 16, 17, 18,
19, 1900, 20, 2000, 21, 22, 23, 24])
现在,只需重塑它即可获得最终结果:
In [94]: np.insert(F, insert_indices, values).reshape(A.shape[0], A.shape[1]+1)
Out[94]:
array([[ 0, 1, 100, 2, 3, 4],
[ 5, 6, 7, 8, 800, 9],
[ 10, 11, 12, 1200, 13, 14],
[ 15, 16, 17, 18, 19, 1900],
[ 20, 2000, 21, 22, 23, 24]])
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句