以特定的方式组合一组数组

2024-04-18 22:18:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组9个不同的数组,大小都是nbyn。为了得到一个特定的数组,我需要按元素组合它们。你知道吗

例如:给定一组9个大小相等的数组:

a1 = np.array([[11, 12, 13], [14, 15, 16], [17, 18, 19]])
a2 = np.array([[21, 22, 23], [24, 25, 26], [27, 28, 29]])
a3 = np.array([[31, 32, 33], [34, 35, 36], [37, 38, 39]])

a4 = np.array([[41, 42, 43], [44, 45, 46], [47, 48, 49]])
a5 = np.array([[51, 52, 53], [54, 55, 56], [57, 58, 59]])
a6 = np.array([[61, 62, 63], [64, 65, 66], [67, 68, 69]])

a7 = np.array([[71, 72, 73], [74, 75, 76], [77, 78, 79]])
a8 = np.array([[81, 82, 83], [84, 85, 86], [87, 88, 89]])
a9 = np.array([[91, 92, 93], [94, 95, 96], [97, 98, 99]])

期望的结果是

b = np.array([[11, 21, 31, 12, 22, 32, 13, 23, 33],
              [41, 51, 61, 42, 52, 62, 43, 53, 63],
              [71, 81, 91, 72, 82, 92, 73, 83, 94],
              [14, 24, 34, 15, 25, 35, 16, 26, 36],
              [44, 54, 64, 45, 55, 65, 46, 56, 66],
              [74, 84, 94, 75, 85, 95, 76, 86, 96],
              [17, 27, 37, 18, 28, 38, 19, 29, 39],
              [47, 57, 67, 48, 58, 68, 49, 59, 69],
              [77, 87, 97, 78, 88, 98, 79, 89, 99]]) 

因此,数组b的第一行由a1、a2和a3的第一行按元素组合而成。你知道吗

阵列b的第二行由a4、a5和a6的第一行组成,按元素组合。你知道吗

第三行由第一行a7、a8和a9组成,按元素组合。你知道吗

然后,a1-a9中的其余行继续使用相同的模式。你知道吗

这需要适用于任何大小的a1-a9阵列,如大小为nbyn的阵列。我试过修补np.连接、拉链和np.einsum公司一点运气都没有。你知道吗


Tags: a2元素a1np模式数组arraya3
3条回答

编辑:通用到不同的数组大小和数组数:

import numpy as np

def combine_arrays(arrays):
    arrays = np.asarray(arrays)
    n, p, q = arrays.shape
    s = int(round(np.sqrt(n)))
    arrays = arrays.reshape(s, -1, p, q)
    return arrays.transpose(2, 0, 3, 1).reshape(s * p, -1)

a1 = np.array([[11, 12, 13], [14, 15, 16], [17, 18, 19]])
a2 = np.array([[21, 22, 23], [24, 25, 26], [27, 28, 29]])
a3 = np.array([[31, 32, 33], [34, 35, 36], [37, 38, 39]])

a4 = np.array([[41, 42, 43], [44, 45, 46], [47, 48, 49]])
a5 = np.array([[51, 52, 53], [54, 55, 56], [57, 58, 59]])
a6 = np.array([[61, 62, 63], [64, 65, 66], [67, 68, 69]])

a7 = np.array([[71, 72, 73], [74, 75, 76], [77, 78, 79]])
a8 = np.array([[81, 82, 83], [84, 85, 86], [87, 88, 89]])
a9 = np.array([[91, 92, 93], [94, 95, 96], [97, 98, 99]])

print(combine_arrays([a1, a2, a3, a4, a5, a6, a7, a8, a9]))
# [[11 21 31 12 22 32 13 23 33]
#  [41 51 61 42 52 62 43 53 63]
#  [71 81 91 72 82 92 73 83 93]
#  [14 24 34 15 25 35 16 26 36]
#  [44 54 64 45 55 65 46 56 66]
#  [74 84 94 75 85 95 76 86 96]
#  [17 27 37 18 28 38 19 29 39]
#  [47 57 67 48 58 68 49 59 69]
#  [77 87 97 78 88 98 79 89 99]]

a1 = np.array([[11, 12], [14, 15]])
a2 = np.array([[21, 22], [24, 25]])
a3 = np.array([[31, 32], [34, 35]])
a4 = np.array([[41, 42], [44, 45]])

print(combine_arrays([a1, a2, a3, a4]))
# [[11 21 12 22]
#  [31 41 32 42]
#  [14 24 15 25]
#  [34 44 35 45]]

您可以通过重塑和调换:

import numpy as np

a1 = np.array([[11, 12, 13], [14, 15, 16], [17, 18, 19]])
a2 = np.array([[21, 22, 23], [24, 25, 26], [27, 28, 29]])
a3 = np.array([[31, 32, 33], [34, 35, 36], [37, 38, 39]])

a4 = np.array([[41, 42, 43], [44, 45, 46], [47, 48, 49]])
a5 = np.array([[51, 52, 53], [54, 55, 56], [57, 58, 59]])
a6 = np.array([[61, 62, 63], [64, 65, 66], [67, 68, 69]])

a7 = np.array([[71, 72, 73], [74, 75, 76], [77, 78, 79]])
a8 = np.array([[81, 82, 83], [84, 85, 86], [87, 88, 89]])
a9 = np.array([[91, 92, 93], [94, 95, 96], [97, 98, 99]])

a = np.stack([a1, a2, a3, a4, a5, a6, a7, a8, a9])
a = a.reshape(3, 3, 3, 3).transpose(2, 0, 3, 1).reshape(9, 9)
print(a)
# [[11 21 31 12 22 32 13 23 33]
#  [41 51 61 42 52 62 43 53 63]
#  [71 81 91 72 82 92 73 83 93]
#  [14 24 34 15 25 35 16 26 36]
#  [44 54 64 45 55 65 46 56 66]
#  [74 84 94 75 85 95 76 86 96]
#  [17 27 37 18 28 38 19 29 39]
#  [47 57 67 48 58 68 49 59 69]
#  [77 87 97 78 88 98 79 89 99]]

至于时间速度(在10000次迭代中使用timeit.repeat来获得它),从最佳到最差:

  1. @jdehesanp.stack+a.reshape(3, 3, 3, 3).transpose(2, 0, 3, 1).reshape(9, 9):9.9e-2秒
  2. @Grzegorz Skibinskivstack+hstack+reshape:1.6e-1秒

试试这个:

>>> import numpy as np
>>> np.hstack([
       np.vstack([a1.ravel(), a2.ravel(), a3.ravel()]).T.reshape(3, -1),
       np.vstack([a4.ravel(), a5.ravel(), a6.ravel()]).T.reshape(3, -1),
       np.vstack([a7.ravel(), a8.ravel(), a9.ravel()]).T.reshape(3, -1)
    ]).reshape(9,9)
array([[11, 21, 31, 12, 22, 32, 13, 23, 33],
       [41, 51, 61, 42, 52, 62, 43, 53, 63],
       [71, 81, 91, 72, 82, 92, 73, 83, 93],
       [14, 24, 34, 15, 25, 35, 16, 26, 36],
       [44, 54, 64, 45, 55, 65, 46, 56, 66],
       [74, 84, 94, 75, 85, 95, 76, 86, 96],
       [17, 27, 37, 18, 28, 38, 19, 29, 39],
       [47, 57, 67, 48, 58, 68, 49, 59, 69],
       [77, 87, 97, 78, 88, 98, 79, 89, 99]])

相关问题 更多 >