如何无循环提取numpy嵌套object数组各子数组的指定位置元素
错误原因
- 你的写法
arr2[::][0, 0]是逐次执行索引:arr2[::]会返回和原arr2完全一致的视图,后续的[0,0]实际是取整个数组第一行第一列的单个3x3子数组,自然无法得到所有子数组的对应元素。 - 你使用的是
dtype=object的numpy数组,这类数组存储的是独立的Python对象(此处为独立的numpy子数组),常规numpy切片不会自动遍历每个对象执行内部索引操作。
无循环实现方案
方案1:短代码快速实现
用np.vectorize包装元素提取逻辑,自动遍历所有子数组取值:
import numpy as np # 向量化包装取子数组[0,0]元素的逻辑 vec_extract = np.vectorize(lambda x: x[0, 0], otypes=[complex]) arr3 = vec_extract(arr2).reshape(-1, 1)
方案2:高性能方案(适合大规模数据)
如果所有子数组形状、类型完全一致,先将object数组转为高维普通数值数组,再用高维索引直接取值,性能远高于方案1:
import numpy as np # 转为形状为(2,2,3,3)的普通复数数组 high_dim_arr = np.array(arr2.tolist()) # 提取所有子数组[0,0]位置元素,调整为目标形状 arr3 = high_dim_arr[..., 0, 0].reshape(-1, 1)
两种方案执行后得到的arr3都符合你要求的输出格式。
内容的提问来源于stack exchange,提问作者Cenzo
相关产品推荐
相关产品推荐

