加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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]])

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读