Существуют ли библиотеки С++ (или C), которые имеют массивы NumPy-типа с поддержкой среза, векторизованных операций, добавления и вычитания содержимого по элементам и т.д.?
Массивы стиля NumPy для С++?
Ответ 1
Вот несколько бесплатных программ, которые могут удовлетворить ваши потребности.
-
Научная библиотека GNU является программным обеспечением GPL, написанным на C. Таким образом, она имеет C-подобное распределение и способ программирования (указатели и т.д.). С GSLwrap вы можете иметь способ программирования C++, все еще используя GSL. GSL имеет реализацию BLAS, но вы можете использовать ATLAS вместо CBLAS по умолчанию, если вы хотите еще больше производительности.
-
Библиотека boost/uBLAS - это библиотека BSL, написанная на C++ и распространяемая в виде пакета boost. Это C++ путь внедрения стандарта BLAS. uBLAS поставляется с несколькими функциями линейной алгебры, и существует экспериментальная привязка к ATLAS.
-
eigen - это библиотека линейной алгебры, написанная в C++, распространяемая по LGPL3 (или GPL2). Это способ программирования C++, но более интегрированный, чем два других (доступно больше алгоритмов и структур данных). Собственное выражение о том, что оно быстрее, чем реализации BLAS, описанные выше, но не соответствует стандарту де-факто BLAS API. Eigen, похоже, не прилагает больших усилий для параллельной реализации.
-
Armadillo - это библиотека LGPL3 для C++. У него есть привязка для LAPACK (библиотека, используемая numpy). Он использует рекурсивные шаблоны и шаблонное метапрограммирование, что является хорошим моментом (я не знаю, делают ли это и другие библиотеки?).
-
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?