【问题标题】:converting multidimensional array slice operation from python to C++将多维数组切片操作从 python 转换为 C++
【发布时间】:2022-01-23 06:01:31
【问题描述】:

我在 python 中有以下代码 sn-p(它是函数的一部分):

def decode_netout(netout, anchors, obj_thresh, net_h, net_w):
        # print("netout print: ", netout.shape, netout[0])
        grid_h, grid_w = netout.shape[:2]
        nb_box = 3
        netout = netout.reshape((grid_h, grid_w, nb_box, -1))
        nb_class = netout.shape[-1] - 5
        boxes = []
        netout[..., :2]  = _sigmoid(netout[..., :2])
        netout[..., 4:]  = _sigmoid(netout[..., 4:])
        netout[..., 5:]  = netout[..., 4][..., np.newaxis] * netout[..., 5:]
        netout[..., 5:] *= netout[..., 5:] > obj_thresh

这里的 netout 是包含 13、13、255 的数组,它被转换为 13、13、3、85。 现在考虑以下陈述,

netout[..., :2]  = _sigmoid(netout[..., :2])

如果我需要将此功能代码转换为 C++ 等效代码,编写此代码的最佳方法是什么。在 C++ 中,netout 是一个浮点数组。 谢谢并恭祝安康, -苏尼尔·普拉尼克

【问题讨论】:

  • 在 C++ 中,netout 只是长度为 43095 的一维向量吗?如果是这样,那么重塑只是以不同的方式进行维度计算的问题。向量运算都会变成循环,除非你使用像 eigen 这样的数学库。

标签: python c++ arrays dimension


【解决方案1】:

这里建议使用高性能库(例如EigenPyTorchArrayFire 或其他库)。如果你想自己做,以netout[..., :2] = _sigmoid(netout[..., :2]) 为例:


struct Array
{
    std::vector<size_t> shape;
    std::vector<float> data;
};

float sigmoid(float input)
{
    // return sigmoid function of input
}

void some_operation(Array &array)
{
    size_t Y = 1, X = array.shape.back();

    for (size_t i = 0; i < array.shape.size() - 1; ++i)
    {
        Y *= array.shape[i];
    }

    for (size_t i = 0; i < Y; ++i)
        for (size_t j = 0; j < 2; ++j)
        {
            array.data[i * X + j] = sigmoid(array.data[i * X + j]);
        }
}

这里的some_operation 函数接受一个数组,由于最后一个维度对我们很重要,其余的都被展平了。所以我们有两个维度Y, X。现在我们可以遍历数据并执行我们想要的操作。

【讨论】:

  • 非常感谢您的帮助。如果我需要使用 pytorch 库,我在哪里可以找到关于在 C++ 中使用 pytorch 进行多维数组处理的文档?或者我可以获得一个 C++ 库,其中 python 操作被定义为新的操作符?
  • 您可以查看我提到的库的文档和入门页面以开始使用。对于 PyTorch,请从 here 下载 libtorch。该库的 C++ 接口非常接近 Python 接口。还有 C++ 入门教程。
猜你喜欢
  • 2021-09-04
  • 2020-05-03
  • 2011-02-21
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
相关资源
最近更新 更多