C++ – C++实现Python numpy的矩阵维度转置算法,例如(N,H,W,C)转换为(N,C,H,W)
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的结果一致,说明变换正确,其它维度的变换可以参考以上思想,举一反三。
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++ – C++实现Python numpy的矩阵维度转置算法,例如(N,H,W,C)转换为(N,C,H,W)
原文链接:https://www.stubbornhuang.com/1759/
发布于:2021年10月15日 17:35:27
修改于:2023年06月26日 21:10:45
当前分类随机文章推荐
- C++ - sleep睡眠函数总结 阅读1870次,点赞0次
- C++ - 得到字符串中某个字符串出现的个数 阅读4402次,点赞2次
- C++ - queue存储动态指针时正确释放内存 阅读6182次,点赞2次
- C++ - 获取当前进程内存使用情况 阅读10588次,点赞10次
- CMake - 链接多线程pthread库的几种方式 阅读58次,点赞0次
- C++ - C++实现Python numpy的矩阵维度转置算法,例如(N,H,W,C)转换为(N,C,H,W) 阅读5056次,点赞4次
- C++11/std::thread - 可作为线程函数的几种方式总结 阅读3900次,点赞1次
- C++ – Unicode编码下的全角字符转半角字符 阅读2701次,点赞0次
- C++ - 使用标准库实现事件和委托,信号和槽机制 阅读604次,点赞0次
- C++ - 使用标准库std::use_facet和std::codecvt进行跨平台gbk与utf8字符集转换 阅读485次,点赞0次
全站随机文章推荐
- Python - 各种包安装、导入问题总结 阅读2697次,点赞0次
- WordPress - 查看别人的网站是用的WordPress的哪个主题 阅读3377次,点赞0次
- 资源分享 - Physically Based Rendering From Theory To Implementation (Fourth Edition)英文高清PDF下载 阅读1042次,点赞0次
- 资源分享 - OpenGL编程指南(原书第7版)- OpenGL红宝书高清扫描版PDF下载 阅读5439次,点赞1次
- Pytorch - 内置的CTC损失函数torch.nn.CTCLoss参数详解与使用示例 阅读2177次,点赞1次
- 资源分享 - Computer Facial Animation , Second Edition 英文高清PDF下载 阅读2203次,点赞0次
- WordPress - wp_registration_url函数详解 阅读1195次,点赞0次
- C++ - 将std::vector中的数值拷贝到数组中 阅读3588次,点赞1次
- C++ - 智能指针的正确使用方式 阅读820次,点赞0次
- CSS - 使用Katex渲染数学公式,数学公式过长超出页面范围的问题修正 阅读56次,点赞0次
评论
169