如何在NumPy中对多特征二维数组与一维标签数组进行配对?
解决方法
首先要明确:你期望的输出结构中,每个元素包含一个长度为3的数组和一个标量,二者形状不一致,因此无法用常规的数值型NumPy数组存储,必须使用object类型的NumPy数组。
你的临时方案分析
np.array(list(zip(inputs, labels)))是可行的,但对于大规模数据,会先将所有元素转换为Python列表对象,存在额外的内存开销和转换成本。
更高效的NumPy原生实现
可以直接初始化一个object类型的数组,再分别赋值输入行和标签,避免中间列表的创建:
import numpy as np inputs = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) labels = np.array([0, 1, 0]) # 创建形状为(n_samples, 2)的object类型空数组 result = np.empty((inputs.shape[0], 2), dtype=object) # 将输入数组的每一行赋值给第一列 result[:, 0] = inputs # 将标签赋值给第二列 result[:, 1] = labels print(result)
输出结果:
[[array([1, 2, 3]) 0] [array([4, 5, 6]) 1] [array([7, 8, 9]) 0]]
如果希望第一列是Python列表而非NumPy数组,只需将赋值语句改为result[:, 0] = inputs.tolist()即可,输出会变成:
[[[1, 2, 3] 0] [[4, 5, 6] 1] [[7, 8, 9] 0]]
效率对比
对于数据量较大的场景,直接初始化object数组并赋值的方式比zip+list的方法更高效:
- 避免了创建中间Python列表的内存开销
- 直接操作NumPy数组的内存,减少了Python对象和NumPy数组之间的转换成本
内容的提问来源于stack exchange,提问作者wapinto
相关产品推荐
相关产品推荐

