为了账号安全,请及时绑定邮箱和手机立即绑定

如何组合两个 numpy 数组,以便对于第一个数组的每一行,我附加第二个数组中的所有行?

如何组合两个 numpy 数组,以便对于第一个数组的每一行,我附加第二个数组中的所有行?

梦里花落0921 2023-12-29 16:10:13
我有以下 numpy 数组:theta_array =array([[ 1, 10],       [ 1, 11],       [ 1, 12],       [ 1, 13],       [ 1, 14],       [ 2, 10],       [ 2, 11],       [ 2, 12],       [ 2, 13],       [ 2, 14],       [ 3, 10],       [ 3, 11],       [ 3, 12],       [ 3, 13],       [ 3, 14],       [ 4, 10],       [ 4, 11],       [ 4, 12],       [ 4, 13],       [ 4, 14]])XY_array  = array([[ 44.0394952 , 505.81099922],       [ 61.03882938, 515.97253226],       [ 26.69851841, 525.18083012],       [ 46.78487831, 533.42309602],       [ 45.77188401, 545.42988355],       [ 81.12969132, 554.78767379],       [ 54.178463  , 565.8716283 ],       [ 41.58952084, 574.76827133],       [ 85.24956815, 585.1355127 ],       [ 80.73726733, 595.49446033],       [ 22.70625059, 605.59017175],       [ 40.66810604, 615.26308629],       [ 47.16694695, 624.39222332],       [ 48.72499541, 633.19846364],       [ 50.68589921, 643.72334885],       [ 38.42731134, 654.68595883],       [ 47.39519707, 666.28232866],       [ 58.07767155, 673.9572227 ],       [ 72.11393347, 683.68307373],       [ 53.70872932, 694.65509894],       [ 82.08237952, 704.5868817 ],       [ 46.64069738, 715.18427515],       [ 40.46032478, 723.91308011],       [ 75.69090892, 733.69595658],       [120.61447884, 745.31322786],       [ 60.17764744, 754.89747186],       [ 87.15961973, 766.24040447],       [ 82.93872713, 773.01518252],       [ 93.56688906, 785.60640153],       [ 70.0474047 , 793.81792947],       [104.3613818 , 805.40234676],       [108.39253837, 814.75002114],       [ 78.97643673, 824.95386427],       [ 85.69096895, 834.44797862],       [ 53.07112931, 844.39555058],       [111.49875807, 855.660508  ],       [ 70.88824958, 865.53417489],       [ 79.55499469, 875.31303945],       [ 60.86941464, 885.85235946],       [101.06017712, 896.69986636],       [ 74.55823544, 905.87417231],       [113.24705653, 915.19350121],       [ 94.21920882, 925.87933273],我试图将两者结合起来,因此对于 theta_array 的每个组合,我从 XY_array 获取所有组合。在 numpy 中进行这种组合/聚合的方式是什么?
查看完整描述

3 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

meshgrid您可以在使用with后对“列”重新排序[:,[0,2,1,3]],如果由于列数较多而需要使列表动态化,那么您可以看到我答案的结尾:


np.array(np.meshgrid(theta_array, XY_array)).T.reshape(-1,4)[:,[0,2,1,3]]

输出:


array([[  1.        ,   1.        ,  44.0394952 , 505.81099922]],

       [[  1.        ,   1.        ,  61.03882938, 515.97253226]],

       [[  1.        ,   1.        ,  26.69851841, 525.18083012]],

       ...,

       [[ 14.        ,  14.        ,  73.86032436, 973.91032818]],

       [[ 14.        ,  14.        , 103.96923524, 984.24366761]],

       [[ 14.        ,  14.        ,  93.20663129, 995.44618851]])

如果您有很多列,您可以动态创建此列表:[0,2,1,3]使用列表理解。例如:


n = new_arr.shape[1]*2

lst = [x for x in range(n) if x % 2 == 0]

[lst.append(z) for z in [y for y in range(n) if y % 2 == 1]]

lst


[0, 2, 4, 6, 1, 3, 5, 7]

然后,您可以重写为:


np.array(np.meshgrid(theta_array, XY_array)).T.reshape(-1,4)[:,lst]


查看完整回答
反对 回复 2023-12-29
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

您可以使用itertools.product:


out = np.array([*product(theta_array, XY_array)])

out = out.reshape(out.shape[0],-1)

输出:


array([[  1.        ,  10.        ,  44.0394952 , 505.81099922],

       [  1.        ,  10.        ,  61.03882938, 515.97253226],

       [  1.        ,  10.        ,  26.69851841, 525.18083012],

       ...,

       [  4.        ,  14.        ,  73.86032436, 973.91032818],

       [  4.        ,  14.        , 103.96923524, 984.24366761],

       [  4.        ,  14.        ,  93.20663129, 995.44618851]])

也就是说,这看起来非常像XY 问题。你想用这个数组做什么?


查看完整回答
反对 回复 2023-12-29
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

正如此处的侧面/补充参考一样,我们对两种解决方案的执行时间进行了比较。完成此特定操作itertools所需的时间比同等操作多 10 倍numpy。


%%time


for i in range(1000):    

    z = np.array(np.meshgrid(theta_array, XY_array)).T.reshape(-1,4)[:,[0,2,1,3]]


CPU times: user 299 ms, sys: 0 ns, total: 299 ms

Wall time: 328 ms

%%time


for i in range(1000):    

    z = np.array([*product(theta_array, XY_array)])    

    z = z.reshape(z.shape[0],-1)


CPU times: user 2.79 s, sys: 474 µs, total: 2.79 s

Wall time: 2.84 s


查看完整回答
反对 回复 2023-12-29
  • 3 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信