it-swarm.com.ru

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

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

57
Llamageddon

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

  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). Он использует рекурсивные шаблоны и шаблонное метапрограммирование, что является хорошим моментом (я не знаю, делают ли это и другие библиотеки?).

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

33
nojhan

Попробуйте 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}}
34
Quant

DyND разработан, среди прочего, как NumPy-подобная библиотека для 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.

7
IanH

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

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

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

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

3
Frédéric Terrazzoni

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

2
Dan Stahlke

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

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

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

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

1
Martin

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

0
Claudio

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

0
Matt Phillips