如何将两个指定形状的numpy数组拼接为(5741, 2)形状的数组?
解决方法:将两个NumPy数组按行打包为(5741, 2)形状的数组
你想要的不是常规的列拼接(那样会得到(5741, 20011)的数组),而是把每个原数组的对应行作为新数组的两个元素,组成一个每行包含两个子数组的(5741, 2)数组对吧?下面是两种可行的实现方式:
方法一:初始化Object类型数组赋值
因为我们要在数组里存储子数组(而非单个数值),需要使用dtype=object的NumPy数组,这样才能容纳不同长度的数组元素:
import numpy as np # 模拟你的输入数组 arr1 = np.random.rand(5741, 20000) arr2 = np.random.rand(5741, 11) # 创建形状为(5741, 2)的空object数组 result = np.empty((arr1.shape[0], 2), dtype=object) # 将两个数组的每行分别赋值给结果的两列 result[:, 0] = list(arr1) result[:, 1] = list(arr2) # 验证形状 print(result.shape) # 输出 (5741, 2) # 验证第一行内容 print(result[0]) # 输出 [array([0.xxx, 0.xxx, ...]), array([0.yyy, 0.yyy, ...])]
方法二:列表推导式转换
用列表推导式先生成包含对应行元组的列表,再转换为object类型的NumPy数组,写法更简洁:
import numpy as np arr1 = np.random.rand(5741, 20000) arr2 = np.random.rand(5741, 11) # 列表推导式生成每行的元组,再转为object数组 result = np.array([(arr1[i], arr2[i]) for i in range(arr1.shape[0])], dtype=object) print(result.shape) # 输出 (5741, 2)
注意事项
- 必须指定
dtype=object:NumPy默认的数值类型数组无法直接存储子数组,object类型允许存储任意Python对象,包括NumPy数组。 - 这种方式不会改变原数组的数据,只是创建了一个包含原数组行引用的新数组(如果需要拷贝数据,可以在赋值时加上
.copy(),比如result[:,0] = [row.copy() for row in arr1])。
内容的提问来源于stack exchange,提问作者UrmLmn
相关产品推荐
相关产品推荐

