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

Numpy 3D数组/Eigen Tensor无循环实现每行乘自身转置的方法

你给出的运算本质是对A[0, :, 0]这个长度为50的一维向量求外积,以下分别给出Eigen和numpy的实现:

Eigen::Tensor 实现(优先方案)

完全使用reshape和broadcast接口实现,无额外依赖:

#include <Eigen/CXX11/Tensor>

int main() {
    // 输入Tensor A 维度为 [55, 50, 2],此处为示例初始化,可替换为你实际的输入
    Eigen::Tensor<double, 3> A(55, 50, 2);

    // 1. 提取目标一维向量,shape为[50]
    Eigen::Tensor<double, 1> vec = A.chip(0, 0).chip(0, 1);

    // 2. 构造左张量:reshape为[50,1]后广播第二个维度到50,得到[50,50]
    Eigen::array<Eigen::Index, 2> left_reshape_dims = {50, 1};
    Eigen::array<Eigen::Index, 2> left_broadcast_dims = {1, 50};
    Eigen::Tensor<double, 2> left = vec.reshape(left_reshape_dims).broadcast(left_broadcast_dims);

    // 3. 构造右张量:reshape为[1,50]后广播第一个维度到50,得到[50,50]
    Eigen::array<Eigen::Index, 2> right_reshape_dims = {1, 50};
    Eigen::array<Eigen::Index, 2> right_broadcast_dims = {50, 1};
    Eigen::Tensor<double, 2> right = vec.reshape(right_reshape_dims).broadcast(right_broadcast_dims);

    // 4. 逐元素相乘得到最终外积结果B
    Eigen::Tensor<double, 2> B = left * right;
    return 0;
}

Numpy实现

仅使用reshape和广播机制,不使用np.einsum、np.dot和循环:

import numpy as np

# 假设A为输入的shape(55,50,2)数组
vec = A[0, :, 0]
# 直接通过reshape加广播得到外积,和你给出的原始代码输出完全一致
B = vec.reshape(50, 1) * vec.reshape(1, 50)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:48:02