You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Numpy实现将不同维度数组按元素组合生成新数组C

用Numpy快速生成目标数组C的解决方案

已知二维数组A(形状为(m, n))和B(形状为(k, p)),需生成数组C,其中C包含A的每个子数组与B的每个子数组的拼接结果,最终C的形状为(m*k, n+p)。以下是两种高效的Numpy实现方案:

方案一:利用广播机制(内存效率更高)

通过扩展数组维度实现广播,避免重复存储原始数组元素:

import numpy as np

# 示例输入
A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([['a', 'b'], ['c', 'd'], ['e', 'f']])

# 扩展维度,使A和B可广播配对
A_expanded = A[:, np.newaxis, :]  # 形状变为 (2, 1, 3)
B_expanded = B[np.newaxis, :, :]  # 形状变为 (1, 3, 2)

# 在第三个维度拼接后展平为二维数组
C = np.concatenate([A_expanded, B_expanded], axis=2).reshape(-1, A.shape[1] + B.shape[1])

print(C)

输出结果:

[['1' '2' '3' 'a' 'b']
 ['1' '2' '3' 'c' 'd']
 ['1' '2' '3' 'e' 'f']
 ['4' '5' '6' 'a' 'b']
 ['4' '5' '6' 'c' 'd']
 ['4' '5' '6' 'e' 'f']]

原理说明

  • 扩展维度后,A的每个行会自动与B的所有行配对,形成(m, k, n+p)的三维中间数组。
  • reshape(-1, ...)自动计算第一维度的长度(即m*k),将三维数组展平为目标二维结构。

方案二:使用repeat与tile(逻辑更直观)

通过重复A的行、平铺B的数组,再直接拼接:

import numpy as np

# 示例输入
A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([['a', 'b'], ['c', 'd'], ['e', 'f']])

# 将A的每一行重复B的行数次数
A_repeated = np.repeat(A, B.shape[0], axis=0)
# 将B整体重复A的行数次数
B_tiled = np.tile(B, (A.shape[0], 1))

# 拼接得到目标数组C
C = np.concatenate([A_repeated, B_tiled], axis=1)

print(C)

输出结果与方案一完全一致。

原理说明

  • np.repeat(A, k, axis=0):把A的每个行连续重复k次(k是B的行数),得到形状为(m*k, n)的数组。
  • np.tile(B, (m, 1)):把B在第一维度重复m次(m是A的行数),得到形状为(m*k, p)的数组。
  • 最后在列维度拼接两个数组,直接得到目标C。

两种方案均为Numpy向量化操作,比Python循环效率高几个数量级,适合处理大规模数组。

内容的提问来源于stack exchange,提问作者Jordano Bruno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:25:11