Подтвердить что ты не робот

Массивы стиля NumPy для С++?

Существуют ли библиотеки С++ (или C), которые имеют массивы NumPy-типа с поддержкой среза, векторизованных операций, добавления и вычитания содержимого по элементам и т.д.?

4b9b3361

Ответ 1

Вот несколько бесплатных программ, которые могут удовлетворить ваши потребности.

  1. Научная библиотека GNU является программным обеспечением GPL, написанным на C. Таким образом, она имеет C-подобное распределение и способ программирования (указатели и т.д.). С GSLwrap вы можете иметь способ программирования C++, все еще используя GSL. GSL имеет реализацию BLAS, но вы можете использовать ATLAS вместо CBLAS по умолчанию, если вы хотите еще больше производительности.

  2. Библиотека boost/uBLAS - это библиотека BSL, написанная на C++ и распространяемая в виде пакета boost. Это C++ путь внедрения стандарта BLAS. uBLAS поставляется с несколькими функциями линейной алгебры, и существует экспериментальная привязка к ATLAS.

  3. eigen - это библиотека линейной алгебры, написанная в C++, распространяемая по LGPL3 (или GPL2). Это способ программирования C++, но более интегрированный, чем два других (доступно больше алгоритмов и структур данных). Собственное выражение о том, что оно быстрее, чем реализации BLAS, описанные выше, но не соответствует стандарту де-факто BLAS API. Eigen, похоже, не прилагает больших усилий для параллельной реализации.

  4. Armadillo - это библиотека LGPL3 для C++. У него есть привязка для LAPACK (библиотека, используемая numpy). Он использует рекурсивные шаблоны и шаблонное метапрограммирование, что является хорошим моментом (я не знаю, делают ли это и другие библиотеки?).

  5. xtensor - это библиотека C++, которая лицензирована BSD. Он предлагает API C++, очень похожий на NumPy. См. Https://xtensor.readthedocs.io/en/latest/numpy.html для шпаргалки.

Эти альтернативы действительно хороши, если вы просто хотите получить структуры данных и базовую линейную алгебру. В зависимости от ваших предпочтений в отношении стиля, лицензии или системных администраторов (установка больших библиотек, таких как LAPACK, может быть затруднена), вы можете выбрать ту, которая лучше всего соответствует вашим потребностям.

Ответ 2

Попробуйте xtensor. (См. Шпаргалку NumPy to Xtensor).

xtensor - это библиотека C++, предназначенная для численного анализа с помощью выражений многомерного массива.

Xtensor обеспечивает

  • расширяемая система выражений, обеспечивающая вещание в стиле numpy.
  • API, соответствующий идиомам стандартной библиотеки C++.
  • инструменты для манипулирования выражениями массива и построения на основе xtensor.

пример

Инициализируйте двумерный массив и вычислите сумму одной из его строк и одномерного массива.

#include <iostream>
#include "xtensor/xarray.hpp"
#include "xtensor/xio.hpp"

xt::xarray<double> arr1
  {{1.0, 2.0, 3.0},
   {2.0, 5.0, 7.0},
   {2.0, 5.0, 7.0}};

xt::xarray<double> arr2
  {5.0, 6.0, 7.0};

xt::xarray<double> res = xt::view(arr1, 1) + arr2;

std::cout << res;

Выходы

{7, 11, 14}

Инициализируйте одномерный массив и измените его на месте.

#include <iostream>
#include "xtensor/xarray.hpp"
#include "xtensor/xio.hpp"

xt::xarray<int> arr
  {1, 2, 3, 4, 5, 6, 7, 8, 9};

arr.reshape({3, 3});

std::cout << arr;

Выходы

{{1, 2, 3},
 {4, 5, 6},
 {7, 8, 9}}

Ответ 3

DyND предназначен, в частности, для библиотеки типа NumPy для С++. Такие вещи, как вещание, арифметические операторы и нарезка, все отлично работают. С другой стороны, он все еще очень экспериментальный, и многие функции еще не реализованы.

Здесь простая реализация алгоритма де Кастеляу в С++ с использованием массивов DyND:

#include <iostream>
#include <dynd/array.hpp>

using namespace dynd;

nd::array decasteljau(nd::array a, double t){
    size_t e = a.get_dim_size();
    for(size_t i=0; i < e-1; i++){
        a = (1.-t) * a(irange()<(e-i-1)) + t * a(0<irange());
    }
    return a;
}

int main(){
    nd::array a = {1., 2., 2., -1.};
    std::cout << decasteljau(a, .25) << std::endl;
}

Я написал короткое сообщение в блоге с большим количеством примеров и бок о бок сравнения синтаксиса для Fortran 90, DyND в С++ и NumPy в Python.

Отказ от ответственности: я являюсь одним из нынешних разработчиков DyND.

Ответ 4

Eigen - хорошая библиотека линейной алгебры.

http://eigen.tuxfamily.org/index.php?title=Main_Page

Это довольно просто установить, поскольку это библиотека только для заголовков. Он использует шаблон для создания хорошо оптимизированного кода. Он автоматически векторизовывает операции с матрицей.

Он также полностью поддерживает операции с коэффициентами, такие как умножение "на каждый элемент" между двумя матрицами, например. Это то, что вам нужно?

Ответ 5

Blitz ++ поддерживает массивы с произвольным количеством осей, тогда как Armadillo поддерживает только до трех (векторов, матриц и кубов). Eigen поддерживает только векторы и матрицы (не кубы). Недостатком является то, что Blitz ++ не имеет функций линейной алгебры за пределами основных операций ввода и тензорных сокращений. Развитие, похоже, замедлилось некоторое время назад, но, возможно, это потому, что библиотека делает то, что она делает, и не так много изменений необходимо сделать.

Ответ 6

VIGRA содержит хорошую реализацию N-мерного массива:

http://ukoethe.github.io/vigra/doc/vigra/Tutorial.html

Я использую его широко, и считаю его очень простым и эффективным. Это также заголовок, поэтому очень легко интегрироваться в среду разработки. Это самая близкая вещь, с которой я столкнулся, используя NumPy с точки зрения этого API.

Основной недостаток заключается в том, что он не так широко используется, как другие, поэтому вы не найдете много помощи в Интернете. Это, и он неловко назван (попробуйте найти его!)

Ответ 7

Eigen - это библиотека шаблонов для линейной алгебры (матрицы, векторы...). Это только заголовок и свободный доступ (LGPL).

Ответ 8

GSL отлично, он делает все, что вы просите, и многое другое. Он лицензируется под GPL.

Ответ 9

В то время как GLM предназначен для простой смены OpenGL и GLSL, это полностью функциональная математическая библиотека только для заголовков для С++ с очень интуитивно понятный набор интерфейсов.

Он объявляет векторные и матричные типы, а также различные операции над ними.

Умножение двух матриц прост как (M1 * M2). Вычитая два вектора (V1-V2).

Доступ к значениям, содержащимся в векторах или матрицах, одинаково прост. Например, после объявления вектора vec3 можно получить доступ к его первому элементу с помощью vector.x. Проверьте это.

Ответ 10

Все это возможно с помощью стандартной библиотеки шаблонов (STL), которая доступна как часть большинства реализаций компилятора. Вы смотрели STL?