以下是我的代碼,用於將形狀[3 4 2]
的boost :: multi_array重塑爲[12 2]
。由於尺寸固定在boost :: multi_array中,因此我首先將三維陣列重塑爲形狀[12 2 1]
,然後將前兩個尺寸複製到新陣列中。我可以在不復制其內容的情況下移除boost :: multi_array的單個維度嗎?
是否有一個更簡單的方法,不會做任何複製(我寧願只是在numpy.reshape的精神的原始數據視圖)。
與g++ -g test.cc && ./a.out
#include "boost/multi_array.hpp"
#include <cassert>
#include <iostream>
int
main() {
// Create a 3D array that is 3 x 4 x 2
typedef boost::multi_array<double, 3> array_type;
typedef array_type::index index;
array_type A(boost::extents[3][4][2]);
// indexer can be const a boost::array
boost::array<array_type::index,3> idx = {{0,0,0}};
// Assign values to the elements
int values = 0;
for(index i = 0; i != 3; ++i)
for(index j = 0; j != 4; ++j)
for(index k = 0; k != 2; ++k)
A[i][j][k] = values++;
std::cout << "array elements: " << A.num_elements() << std::endl;
std::cout << "array ndim: " << A.num_dimensions() << std::endl;
std::cout << "array size: " << A.size() << std::endl; // equivalent to a.shape()[0];
std::cout << "array shape: " << A.shape()[0] <<" " << A.shape()[1] <<" " << A.shape()[2] << std::endl;
int verify = 0;
for(index i = 0; i != 3; ++i)
for(index j = 0; j != 4; ++j)
for(index k = 0; k != 2; ++k) {
std::cout << "A[" <<i <<"]["<<j<<"]["<<k<<"] = " << A[i][j][k] << std::endl;
assert(A[i][j][k] == verify++);
}
boost::array<array_type::index,3> dims2 = {{12, 2, 1}};
A.reshape(dims2);
std::cout << "array shape: " << A.shape()[0] <<" " << A.shape()[1] <<" " << A.shape()[2] << std::endl;
for(index i = 0; i != 12; ++i)
for(index j = 0; j != 2; ++j)
for(index k = 0; k != 1; ++k) {
std::cout << "A[" <<i <<"]["<<j<<"]["<<k<<"] = " << A[i][j][k] << std::endl;
}
typedef boost::multi_array<double, 2> Array2d;
Array2d B(boost::extents[12][2]);
for(index i = 0; i != 12; ++i)
for(index j = 0; j != 2; ++j){
B[i][j] = A[i][j][0];
std::cout << "B[" <<i <<"]["<<j<<"] = " << B[i][j] << std::endl;
}
return 0;
}
感謝您的回答。這絕對比我的解決方案好。這個修改後的行做我想要的:'boost :: const_multi_array_ref < double, 2 > B(A.data(),boost :: extents [12] [2]);' – Sebastian
如果我正確理解'multi_array :: reshape'的作用,效果與我的方法類似(我仍然會考慮爲可讀性和靈活性編寫小封裝)。如果我的答案似乎可以接受,請接受它。 – mkluwe