Python中如何从多个numpy数组提取指定元素构建新数组
问题根因
原代码无法得到预期结果的核心问题有3个:
- 构造的数组
A内三个子数组维度不统一:A[0]是shape为(3,3)的二维数组,A[1]、A[2]是shape为(1,3,3)的三维数组,直接索引会出现维度错位 - 循环索引逻辑错误:循环过程中始终只访问
A[0]的元素,完全没有读取A[1]、A[2]的内容,且每次循环都直接覆盖B的值,没有做累积拼接 - 取值逻辑错误:仅取了每行第一个元素,没有提取全部9个位置的数值做对应位置匹配。
正确实现代码
先将每个子数组统一展平为长度为9的一维数组,再按列堆叠即可得到目标数组:
import numpy as np A = np.array([ np.array([[1, 2, 3], [4, 5, 6 ], [7, 8, 9]]), np.array([[[10, 11, 12], [13, 14, 15 ], [16, 17, 18]]]), np.array([[[19, 20, 21], [22, 23, 24], [25, 26, 27]]]) ], dtype=object) # 每个子数组展平后按列拼接 B = np.column_stack([sub_arr.flatten() for sub_arr in A]) print(B)
运行后输出和预期完全一致:
[[ 1 10 19] [ 2 11 20] [ 3 12 21] [ 4 13 22] [ 5 14 23] [ 6 15 24] [ 7 16 25] [ 8 17 26] [ 9 18 27]]
额外优化提示
如果可以控制A的初始化逻辑,建议构造A时就保持三个子数组维度一致,去掉A[1]、A[2]外层多余的方括号,后续处理效率会更高:
# 维度统一的A初始化方式 A = np.array([ [[1, 2, 3],[4, 5, 6],[7, 8, 9]], [[10, 11, 12],[13, 14, 15],[16, 17, 18]], [[19, 20, 21],[22, 23, 24],[25, 26, 27]] ]) # 直接转置后reshape就能得到结果,不需要遍历 B = A.T.reshape(-1, 3)
内容的提问来源于stack exchange,提问作者Wiz123
相关产品推荐
相关产品推荐

