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


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

10 51

10 ответов:

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

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

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

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

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

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

попробовать 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}

инициализировать 1-D массив и изменить его на месте.

#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}}

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

вот простая реализация алгоритм де Кастельжо на C++ с использованием массивов 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 в C++ и NumPy в Python.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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