xtensor调用tile函数触发std::bad_array_new_length错误的问题求助
xtensor调用tile函数触发std::bad_array_new_length错误的问题求助
我在尝试用xtensor实现NumPy中np.tile(a[:,0], (len(b), 1))的功能时遇到了问题:当b的第一维度长度M>1时,程序会抛出std::bad_array_new_length异常。我已经反复确认了a和b的形状是正确的,但始终找不到问题根源。
我的实现代码如下:
xt::xarray<float> res = xt::tile( xt::reshape_view( xt::view(a, xt::all(), 0), {1, static_cast<int>(a.shape(0))} ), {static_cast<int>(b.shape(0)),1} );
其中a是形状为(N,21)的xt::xarray<float>,b是形状为(M,21)的xt::xarray<float>。
为了复现问题,我写了一个简化的测试文件:
#include <xtensor/xarray.hpp> #include <xtensor/xpad.hpp> #include <xtensor/xio.hpp> #include <xtensor/xrandom.hpp> #include <xtensor/xview.hpp> int main(){ xt::xarray<float> a = xt::random::rand<float>({2,21}); xt::xarray<float> b = xt::random::rand<float>({2,21}); xt::xarray<float> res = xt::tile( xt::reshape_view( xt::view(a, xt::all(), 0), {1, static_cast<int>(a.shape(0))} ), {static_cast<int>(b.shape(0)),1} ); std::cout << res << std::endl; return 0; }
问题分析与解决方案
std::bad_array_new_length通常是因为数组维度计算异常,或者尝试分配的内存超出系统允许范围导致的。结合你的代码,这里提供几个可能的解决方向:
- 先将视图转为实际数组再操作
你当前直接对xt::view返回的视图对象做reshape_view和tile,视图的延迟计算特性可能导致维度计算出错。可以先把视图转换为实际数组,再执行后续步骤:
// 提取第一列并转为实际数组 xt::xarray<float> a_col = xt::view(a, xt::all(), 0); // 重塑为(1, N)的二维行向量 auto a_col_2d = xt::reshape_view(a_col, {1, static_cast<int>(a_col.size())}); // 执行tile操作 xt::xarray<float> res = xt::tile(a_col_2d, {static_cast<int>(b.shape(0)), 1});
- 改用broadcast_to实现需求
你的需求本质是把一维的a[:,0]在第一个维度重复M次,生成(M, N)的二维数组,这种场景下xt::broadcast_to比tile更高效,也能避开视图相关的坑:
// 将一维列向量扩展为(1, N)的二维行向量 auto a_col_expanded = xt::expand_dims(xt::view(a, xt::all(), 0), 0); // 广播到目标形状(M, N) xt::xarray<float> res = xt::broadcast_to(a_col_expanded, {static_cast<int>(b.shape(0)), static_cast<int>(a.shape(0))});
- 检查xtensor版本
如果上述方法都无效,可能是你使用的xtensor版本存在兼容性bug,建议升级到最新稳定版本后再测试代码。
备注:内容来源于stack exchange,提问作者las
相关产品推荐
相关产品推荐

