C++ 您所在的位置:网站首页 numpy如何转置矩阵 C++

C++

2022-05-06 18:19| 来源: 网络整理| 查看: 265

赞 (0) 打賞打赏 打赏支付宝扫一扫 打赏微信扫一扫 首页 › 编程技术 › C++ › 正文 C++transpose矩阵维度变换 C++ – C++实现Python numpy的矩阵维度转置算法,例如(N,H,W,C)转换为(N,C,H,W) StubbornHuang C++ 2021-10-15 946 0 0 百度未收录 本文共1812个字,阅读需要5分钟。

本文作者:StubbornHuang

版权声明:本文为站长原创文章,如果转载请注明原文链接!

原文标题:C++ – C++实现Python numpy的矩阵维度转置算法,例如(N,H,W,C)转换为(N,C,H,W)

原文链接:https://www.stubbornhuang.com/1759/

发布于:2021年10月15日 17:35:27

修改于:2021年10月15日 17:35:27

1 C++实现Python numpy的矩阵维度转置算法,例如(N,H,W,C)转换为(N,C,H,W) 1.1 python中使用numpy进行矩阵维度变换

在python中常常使用numpy的transpose对矩阵的维度进行转换,这里以(N,H,W,C)转换为(N,C,H,W)为例,请看一下代码。

import numpy as np if __name__ == '__main__': a = np.arange(0,24,1) N = 1 H = 2 W = 3 C = 4 a = np.reshape(a,[1,2,3,4]) print(a) a_copy = a test_copy = a print(a.flatten()) # N.H,W,C -> N,C,H,W a_copy = np.transpose(a_copy,[0,3,1,2]) print(a_copy.flatten()) # 使用数组transpose a_new = [] for n in range(N): for c in range(C): for h in range(H): for w in range(W): a_new.append(test_copy[n,h,w,c]) print(a_new)

输出结果:

[[[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]]] [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23] [ 0 4 8 12 16 20 1 5 9 13 17 21 2 6 10 14 18 22 3 7 11 15 19 23] [0, 4, 8, 12, 16, 20, 1, 5, 9, 13, 17, 21, 2, 6, 10, 14, 18, 22, 3, 7, 11, 15, 19, 23]

在以上的python代码中使用了0-23个常数先组成了(1,2,3,4)的四维矩阵

[[[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]]]

,事实上该四维矩阵在内存中的排列如下:

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

然后使用了np.transpose对维度排列进行了变换,从(N,H,W,C)转换为(N,C,H,W),修改后矩阵在内存中的排列如下:

[ 0 4 8 12 16 20 1 5 9 13 17 21 2 6 10 14 18 22 3 7 11 15 19 23] 1.2 在C++中对矩阵进行维度变换

平时在使用TensorRT部署工业模型的时候,经常需要将数据变换为深度学习模型需要的维度数据,这里面就少不了对原有的数据做最后的维度变换输入到深度学习模型中进行推理,如果数据维度变换不正确,直接会导致推理结果出错。但是在C++中并没有numpy这么好用的库,TensorRT的模型输入数据往往被抽象为一个一维数组,那么如何进行维度变换呢?

在C++中对矩阵数据进行(N,H,W,C)转换为(N,C,H,W)的代码如下,其核心思想就是:将原矩阵中的第(N,H,W,C)个值赋值给transpose后的矩阵的(N,C,H,W)位置的值,这样就完成了矩阵的维度变换。

#include #include int main() { int N = 1; int H = 2; int W = 3; int C = 4; float temp_int[24] = { 0, 1, 2, 3, 4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 }; float temp_int_transpose[24] = { 0 }; // [N,H,W,C] -> [N,C,H,W] for (int n = 0; n < N; ++n) { for (int c = 0; c < C; ++c) { for (int h = 0; h < H; ++h) { for (int w = 0; w < W; ++w) { int old_index = n * H * W * C + h * W * C + w * C + c; int new_index = n * C * H * W + c * H * W + h * W + w; temp_int_transpose[new_index] = temp_int[old_index]; std::cout nctw’,(a,b))算子模式 阅读97次,点赞0次VPS - 使用XShell连接VPS 阅读2197次,点赞0次资源分享 - GDI+教程(C++中文版 GDI+SDK中文参考手册)PDF下载 阅读1474次,点赞0次资源分享 - 游戏引擎架构,Game Engine Architecture 中文版PDF下载 阅读427次,点赞0次左手坐标系与右手坐标系 阅读2055次,点赞0次资源分享 - C++程序设计语言(第1- 3部分),原书第4版 高清PDF下载 阅读1019次,点赞1次资源分享 - 用Python写网络爬虫(第2版 Katharine Jarmul,Richard Lawson著 李斌译) 阅读1104次,点赞0次资源分享 - Handbook of Discrete and Computational Geometry, Second Edition 英文高清PDF下载 阅读753次,点赞0次OpenCV - 打开视频文件,并对其中的每一帧图像进行Canny算子边缘化提取,并将结果保存为视频文件 阅读2162次,点赞0次资源分享 - 实时阴影技术,Real-Time Shadows中文版PDF下载 阅读157次,点赞0次

如果您觉得对您有帮助,可以请站长喝一杯咖啡哦!

记得在赞赏备注里写上您的昵称

金额随意,礼轻义重

您可在本站资助名单中查看你的打赏记录哦!

支付宝扫一扫

微信扫一扫

赞 (0) 打賞打赏 打赏支付宝扫一扫 打赏微信扫一扫 分享 微博微信QQ好友更多 上一篇资源分享 - Computer Graphics Programming in OpenGL with C++, Second Edition 英文高清PDF下载 下一篇资源分享 - GPGPU Programming for Games and Science 英文高清PDF下载


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有