如何快速将二维NumPy数组与一维NumPy数组合并为指定结构的数组?
如何快速将二维NumPy数组与一维NumPy数组合并为指定结构的数组?
嘿,这个需求我熟!要把二维NumPy数组的每一行和一维数组的对应元素配对成你要的那种结构,最快的方式肯定是用NumPy原生的向量化操作,别用循环或者列表推导——大数据量下慢得离谱。
先明确下输入情况:假设A是形状为(N, M)的二维NumPy数组(比如你例子里M=3),B是形状为(N,)的一维NumPy数组,目标是生成C,其中每个元素都是[A的第i行, B的第i个元素]。
最快的NumPy向量化实现
如果希望结果是NumPy数组类型,直接用stack结合维度扩展就能搞定,完全不用循环:
import numpy as np # 先拿你的示例数据试试 A = np.array([[1, 3, 6], [2, 2, 5]]) B = np.array([2, 6]) # 把B扩展成二维数组(形状从(N,)变成(N,1)),然后和A在第1个轴上堆叠 C = np.stack([A, B[:, np.newaxis]], axis=1) # 看看结果 print(C[0]) # 输出: array([[1, 3, 6], [2]]) print(C[1]) # 输出: array([[2, 2, 5], [6]])
这样得到的C是NumPy数组,形状为(N, 2),每个位置的元素正好对应你要的结构,而且完全是向量化操作,速度拉满。
要是需要严格的混合结构(数组+标量)
如果你希望每个元素里的第二个值是纯标量,而不是长度为1的数组,可以用NumPy的结构化数组,它能存储不同类型/维度的元素,同时保持NumPy的高效性:
# 定义结构化数据类型:第一个字段是3个整数的数组,第二个是单个整数 dtype = [('row_from_A', np.int32, 3), ('val_from_B', np.int32)] C = np.empty(len(A), dtype=dtype) # 批量赋值,比循环快多了 C['row_from_A'] = A C['val_from_B'] = B # 访问起来也很方便 print(C[0]) # 输出: ([1, 3, 6], 2) print(C[0]['row_from_A']) # 输出: [1 3 6] print(C[0]['val_from_B']) # 输出: 2
小数据量图省事的方法
如果数据量很小,不用追求极致性能,列表推导也能快速搞定,写法简单直观:
C = [[A[i], B[i]] for i in range(len(A))] print(C) # 输出: [[array([1, 3, 6]), 2], [array([2, 2, 5]), 6]]
但注意哦,数据量大的时候这种Python级别的循环会比NumPy向量化操作慢很多,谨慎使用。
备注:内容来源于stack exchange,提问作者Geremia
相关产品推荐
相关产品推荐

