C++ – C++实现Python numpy的矩阵维度转置算法,例如(N,H,W,C)转换为(N,C,H,W)
本文作者: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 <iostream>
#include <string>
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 << temp_int_transpose[new_index] << ",";
}
}
}
}
getchar();
return 0;
}
打印结果:

1.3 python、C++结果比较
从最后的输出结果上看,C++维度变换的结果与python的结果一致,说明变换正确,其它维度的变换可以参考以上思想,举一反三。
当前分类随机文章推荐
- C++读取Shp文件并将Shp转化为DXF 阅读2179次,点赞0次
- C++ – 字节数组byte[]或者unsigned char[]与short的相互转换 阅读176次,点赞0次
- C++ - std::string替换字符串中所有指定的子字符串 阅读35次,点赞0次
- C++11 - 快速学会正则表达式 阅读481次,点赞2次
- C++ - 函数返回多个返回值的方法总结 阅读574次,点赞0次
- C++ – 字节数组byte[]或者unsigned char[]与long long的相互转换 阅读194次,点赞0次
- C++ - 阿拉伯数字字符串转换为中文读法的中文字符串,支持小数点 阅读441次,点赞0次
- C++ - 使用Websocket++编写客户端连接WebSocket服务器并进行通信 阅读2064次,点赞2次
- GCC/GG++中编译优化选项-O -O0 -O1 -O2 -O3 -Os -Ofast -Og -Oz各自的区别和作用 阅读137次,点赞0次
- C++ - vector存储动态指针时正确释放内存 阅读3790次,点赞0次
全站随机文章推荐
- OpenGL地球与太阳绕转代码 阅读2130次,点赞0次
- 计算几何与计算机图形必备书单整理,附下载链接! 阅读8033次,点赞13次
- 资源分享 - Real-Time Cameras - A Guide for Game Designers and Developers 英文高清PDF下载 阅读1110次,点赞0次
- Python - list/numpy/pytorch tensor相互转换 阅读795次,点赞0次
- 资源分享 - PHP与MySQL程序设计(第4版) 中文 PDF下载 阅读1866次,点赞0次
- 资源分享 – OpenGL SuperBible - Comprehensive Tutorial and Reference (Sixth Edition) OpenGL蓝宝书第6版英文高清PDF下载 阅读940次,点赞0次
- 资源分享 - Data Structures and Algorithms for Game Developers 英文高清PDF下载 阅读549次,点赞0次
- OpenGL画四个三角形组成四面体,并进行旋转 阅读2267次,点赞0次
- 资源分享 - GPU Pro 6 - Advanced Rendering Techniques 英文高清PDF下载 阅读1423次,点赞0次
- 计算机图形学 - 大白话模型视图投影矩阵(MVP)以及各种变换空间(模型空间、世界空间、相机空间、裁剪空间、屏幕空间) 阅读410次,点赞0次
评论
144