python - 以特定方式组合一组数组
问题描述
我有一组 9 个不同的数组,大小均为n × n。我需要以元素方式组合它们以产生特定的数组。
例如:给定一组 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 数组,因为数组的大小为n × n。我试过修补 np.concatenate、zip 和 np.einsum,但都没有运气。
解决方案
编辑:推广到不同的数组大小和数组数量:
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]]
推荐阅读
- java - 部署到 Heroku 的 Spring App 中的日期加载问题
- java - SpringData JPA“AND”和“OR”查询未按预期工作
- loops - VBA - 两个日期之间的场景分析 - 如何添加观察窗口不重叠的条件
- python - 无法对从条目小部件 tkinter 获得的数据进行类型转换
- c++ - __func__ 在调试时返回类名,但在发布时不返回
- scala - 在 Scala 中将数据帧转换为 Key 为 int 且 Value 为列表的 hashmap
- python - 在 Flask 中启动应用级别的深度学习模型
- node.js - 如果从嵌套函数调用,则无法从 nodejs 中的 postgres 获取结果
- javascript - 带有数组位置方括号的 Javascript 对象属性访问器字符串
- jar - 如何保护 JAR 免受 JAD 反编译?