如何用Pythonic方式从4个一维NumPy数组生成6个2×2二维数组
如何用Pythonic方式从4个一维NumPy数组生成6个2×2二维数组
嘿,这个需求太常见啦!咱们直接用Python/NumPy的原生语法来搞定,既简洁又高效,绝对够Pythonic~ 我给你分几种场景来推荐方法,按需取用就行!
先定义好输入数组(方便后续测试)
首先咱们先把题目里的输入数组准备好:
import numpy as np Sxx = np.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]) Sxy = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6]) Syx = Sxy # 题目里说Syx和Sxy相等 Syy = np.array([1.1, 2.1, 3.1, 4.1, 5.1, 6.1])
场景1:生成NumPy 3D数组(6个2×2矩阵,最适合数值计算)
如果后续还要对这些矩阵做数值运算,强烈推荐用NumPy的3D数组,完全不用写循环,效率拉满:
# 第一步:把4个一维数组按列拼接成(6,4)的二维数组 stacked_2d = np.column_stack((Sxx, Sxy, Syx, Syy)) # 第二步:把每一行的4个元素重塑成2×2矩阵,自动得到(6,2,2)的3D数组 S_3d = stacked_2d.reshape(-1, 2, 2)
验证一下:print(S_3d[0]) 会输出:
[[1. 0.1] [0.1 1.1]]
完美匹配你要的第一个格式!
另一种等价写法(更紧凑)
如果你喜欢一行搞定,也可以用stack+转置:
S_3d = np.stack((Sxx, Sxy, Syx, Syy)).T.reshape(-1, 2, 2)
场景2:生成Python列表形式的2×2矩阵
如果你更习惯用原生Python列表,列表推导式+zip的组合绝对是Pythonic的代表,可读性拉满:
S_matrix_list = [ [[sxx, sxy], [syx, syy]] for sxx, sxy, syx, syy in zip(Sxx, Sxy, Syx, Syy) ]
这样得到的S_matrix_list就是一个包含6个2×2列表的大列表,和你要的第二个示例完全一致。
场景3:生成Python列表形式的1×4数组
这个更简单,同样用列表推导式+zip,一行搞定:
S_flat_list = [ [sxx, sxy, syx, syy] for sxx, sxy, syx, syy in zip(Sxx, Sxy, Syx, Syy) ]
得到的就是你要的扁平子列表形式。
小技巧:利用Syx=Sxy简化代码
因为题目里明确Syx = Sxy,所以咱们可以不用重复传参,直接复用Sxy,让代码更简洁:
# 比如场景1的简化版 S_3d = np.column_stack((Sxx, Sxy, Sxy, Syy)).reshape(-1, 2, 2) # 场景3的简化版 S_flat_list = [[sxx, sxy, sxy, syy] for sxx, sxy, syy in zip(Sxx, Sxy, Syy)]
怎么样,这些方法应该能完美覆盖你的需求了吧?选哪种主要看你后续的使用场景——如果要做矩阵运算,优先选NumPy 3D数组;如果只是需要简单的数据结构,列表推导式足够直观好用~
备注:内容来源于stack exchange,提问作者squashed.bugaboo
相关产品推荐
相关产品推荐

