您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 两个numpy数组中所有行的组合

5b51 2022/1/14 8:21:40 python 字数 3384 阅读 535 来源 www.jb51.cc/python

我有两个数组,例如形状(3,2)和另一个形状(10,7).我想要两个数组的所有组合,这样我最终得到一个9列数组.换句话说,我希望第一个数组的每一行的所有组合与第二个数组的行.我怎样才能做到这一点?据我所知,我没有正确使用meshgrid.根据以前的帖子,我的印象是a1 = np.zeros((10,7)) a2 = np.zeros((3,2)) r = n

概述

我有两个数组,例如形状(3,2)和另一个形状(10,7).我想要两个数组的所有组合,这样我最终得到一个9列数组.换句话说,我希望第一个数组的每一行的所有组合与第二个数组的行.

我怎样才能做到这一点?据我所知,我没有正确使用meshgrid.

根据以前的帖子,我的印象是

a1 = np.zeros((10,7))
a2 = np.zeros((3,2))
r = np.array(np.meshgrid(a1,a2)).T.reshape(-1,a1.shape[1] + a2.shape[1])

会工作,但这给我的尺寸(84,10).

关注性能这里的一种方法是使用数组初始化和元素广播进行分配 –

m1,n1 = a1.shape
m2,n2 = a2.shape
out = np.zeros((m1,m2,n1+n2),dtype=int)
out[:,:,:n1] = a1[:,None,:]
out[:,n1:] = a2
out.shape = (m1*m2,-1)

说明:

诀窍在于两个步骤:

out[:,n1:] = a2

步骤1 :

In [227]: np.random.seed(0)

In [228]: a1 = np.random.randint(1,9,(3,2))

In [229]: a2 = np.random.randint(1,(2,7))

In [230]: m1,n1 = a1.shape
     ...: m2,n2 = a2.shape
     ...: out = np.zeros((m1,dtype=int)
     ...: 

In [231]: out[:,:]

In [232]: out[:,:n1]
Out[232]: 
array([[[5,8],[5,8]],[[6,1],[6,1]],[[4,4],[4,4]]])

In [233]: a1[:,:]
Out[233]: 
array([[[5,4]]])

因此,基本上我们分配a1的元素,保持第一轴与输出中相应的一个轴对齐,同时让输出数组的第二轴上的元素以广播的方式填充,对应于为a1添加的newaxis那个轴.这是关键所在并带来性能,因为我们没有分配额外的内存空间,否则我们需要使用显式的重复/平铺方法.

第2步 :

In [237]: out[:,n1:] = a2

In [238]: out[:,n1:]
Out[238]: 
array([[[4,8,2,4,6,3,5],[8,7,1,5,2]],2]]])

In [239]: a2
Out[239]: 
array([[4,2]])

这里,我们基本上沿着输出数组的第一轴广播块a2而不明确地重复复制.

样本输入,输出完整性 –

In [242]: a1
Out[242]: 
array([[5,4]])

In [243]: a2
Out[243]: 
array([[4,2]])

In [244]: out
Out[244]: 
array([[[5,2]]])

方法#2

一个有平铺/重复 –

parte1 = np.repeat(a1[:,:],axis=0).reshape(-1,m2)
parte2 = np.repeat(a2[None],m1,n2)
out = np.c_[parte1,parte2] 

总结

以上是编程之家为你收集整理的python – 两个numpy数组中所有行的组合全部内容,希望文章能够帮你解决python – 两个numpy数组中所有行的组合所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶