python – 在numpy数组中非对齐插入未对齐的元素
发布时间:2020-12-20 12:07:23 所属栏目:Python 来源:网络整理
导读:我正在使用numpy 1.9来处理一组数组.假设我有类似的东西,我有两个2d数组A和B以及1-d数组C,看起来像这样: Aarray([[ 1.,1.,1.],[ 1.,1.]]) Barray([[-1.,-1.,-1.],[-1.,-1.]]) Carray([1,3,2,4,0]) 我的目标是根据C在A中插入所有元素.更具体地说,如果位置0处
我正在使用numpy 1.9来处理一组数组.假设我有类似的东西,我有两个2d数组A和B以及1-d数组C,看起来像这样:
>>> A array([[ 1.,1.,1.],[ 1.,1.]]) >>> B array([[-1.,-1.,-1.],[-1.,-1.]]) >>> C array([1,3,2,4,0]) 我的目标是根据C在A中插入所有元素.更具体地说,如果位置0处的C具有1,则应在A [0,1]之后插入B [0,1]. 这是预期的结果: array([[ 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,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,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,[ 5,[ 10,[ 15,19,[ 20,2000,24]]) 这是分解版本: A.ravel()将A展平为一维数组,我将其称为F: In [87]: F = A.ravel() In [88]: F Out[88]: array([ 0,5,9,10,14,15,20,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]),A.shape) + 1 In [90]: insert_indices Out[90]: array([ 2,21]) B [range(B.shape [0]),C]从B中提取所需的值: In [91]: values = B[range(B.shape[0]),C] In [92]: values Out[92]: array([ 100,1900,2000]) np.insert执行实际插入并创建一个新数组: In [93]: np.insert(F,insert_indices,values) Out[93]: array([ 0,24]) 现在只需重塑一下即可获得最终结果: In [94]: np.insert(F,values).reshape(A.shape[0],A.shape[1]+1) Out[94]: array([[ 0,24]]) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |