我正在转换Python program to C++
格式。
Python有一个格式如下的数组。
boxes = np.zeros((1, 300, 4, 5, 1), dtype = np.float)
创建类似于C++
数组的boxes
数组的最佳方法是什么?
答案 0 :(得分:4)
我想是
auto boxes = std::array<
std::array<
std::array<
std::array<
std::array<float, 1U>, 300U>, 4U>, 5U>, 1U> {};
或者,为了避免Humam Helfawi指出的堆栈溢出问题,您可以使用std::vector
(所以堆内存),如下所示
auto boxes2 = std::vector<
std::vector<
std::vector<
std::vector<
std::vector<float>>>>>
(1U, std::vector<
std::vector<
std::vector<
std::vector<float>>>>
(300U, std::vector<
std::vector<
std::vector<float>>>
(4U, std::vector<
std::vector<float>>
(5U, std::vector<float>
(1U, 0.0f)))));
或者,正如n.caillou所建议的那样,
using boxA5 = std::array<
std::array<
std::array<
std::array<
std::array<float, 1U>, 300U>, 4U>, 5U>, 1U>;
auto boxes3 = std::unique_ptr<boxA5> { new boxA5{} };
答案 1 :(得分:4)
实际上,numpy分配连续的数组存储,strides用于根据多维索引计算内存偏移量。要在C ++中实现类似的结果,您可以编写如下内容:
#include <vector>
#include <memory>
#include <cstddef>
#include <cstdio>
class NDArray {
std::vector<size_t> m_dims, m_strides;
std::unique_ptr<float[]> m_buf;
public:
NDArray(std::vector<size_t> dims):
m_dims{std::move(dims)}
{
m_strides.resize(m_dims.size());
size_t stride = 1;
for (int i = m_dims.size() - 1; i >= 0; -- i) {
m_strides[i] = stride;
stride *= m_dims[i];
}
m_buf.reset(new float[stride]);
}
float& operator[] (std::initializer_list<size_t> idx) {
size_t offset = 0;
auto stride = m_strides.begin();
for (auto i: idx) {
offset += i * *stride;
++ stride;
}
return m_buf[offset];
}
};
int main() {
NDArray arr({2, 3});
arr[{1, 2}] = 3;
arr[{1, 1}] = 2;
printf("%g\n", arr[{1, 2}]);
}
答案 2 :(得分:2)
#include <iostream>
#include <vector>
vector<vector<vector<vector<double> > > > v;
v.resize(1);
v[0].resize(300);
for(int i=0;i<300;i++)
{
v[0][i].resize(4);
for(int j=0;j<4;j++)
{
v[0][i][j].resize(5);
for(int l=0;l<5;l++)
v[0][i][j][l]=double(0.0);
}
}