web-dev-qa-db-de.com

Arrays im NumPy-Stil für C++?

Gibt es C++ - (oder C) -Bibliotheken, die NumPy-artige Arrays mit Unterstützung für Slicing, vektorisierte Operationen, Hinzufügen und Subtrahieren von Inhalten Element für Element usw. haben?

57
Llamageddon

Hier sind einige kostenlose Software, die Ihren Bedürfnissen entsprechen.

  1. Die GNU Scientific Library ist eine GPL-Software, die in C geschrieben wurde. Daher verfügt sie über eine C-ähnliche Zuordnung und Art der Programmierung (Zeiger usw.). Mit GSLwrap können Sie C++ programmieren, während Sie die GSL verwenden. GSL hat eine BLAS -Implementierung, Sie können jedoch anstelle des Standard-CBLAS ATLAS verwenden, wenn Sie noch mehr Leistung wünschen.

  2. Die boost/uBLAS - Bibliothek ist eine BSL-Bibliothek, die in C++ geschrieben und als Boost-Paket vertrieben wird. Es ist eine C++ - Methode zur Implementierung des BLAS-Standards. uBLAS enthält einige lineare Algebra-Funktionen, und es gibt eine experimentelle Bindung an ATLAS .

  3. eigen ist eine in C++ geschriebene lineare Algebra-Bibliothek, die unter der LGPL3 (oder GPL2) vertrieben wird. Es ist eine C++ - Art der Programmierung, jedoch integrierter als die beiden anderen (mehr Algorithmen und Datenstrukturen sind verfügbar). Eigen behaupten, schneller zu sein als die oben genannten BLAS-Implementierungen, während sie nicht der faktischen Standard-BLAS-API folgen. Eigen scheint nicht viel Aufwand für die parallele Implementierung zu leisten.

  4. Armadillo ist LGPL3-Bibliothek für C++. Es ist bindend für LAPACK (die von numpy verwendete Bibliothek). Es verwendet rekursive Templates und Template-Meta-Programmierung, was ein guter Punkt ist (ich weiß nicht, ob andere Bibliotheken dies auch tun?).

Diese Alternativen sind wirklich gut, wenn Sie nur Datenstrukturen und grundlegende lineare Algebra erhalten möchten. Abhängig von Ihrem Geschmack bezüglich Stil, Lizenz oder Sysadmin-Herausforderungen (die Installation großer Bibliotheken wie LAPACK kann schwierig sein), können Sie diejenige auswählen, die Ihren Anforderungen am besten entspricht.

33
nojhan

Probiere xtensor aus. (Siehe das NumPy to Xtensor Cheat Sheet ).

xtensor ist eine C++ - Bibliothek für die numerische Analyse mit mehrdimensionalen Array-Ausdrücken.

xtensor bietet

  • ein erweiterbares Ausdruckssystem, das Broadcasting im numpy-Stil ermöglicht.
  • eine API, die den Idiomen der C++ - Standardbibliothek folgt.
  • werkzeuge zum Bearbeiten von Array-Ausdrücken und zum Aufbau von Xtensor.

Beispiel

Initialisieren Sie ein 2-D-Array und berechnen Sie die Summe einer seiner Zeilen und eines 1-D-Arrays.

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

Ausgänge

{7, 11, 14}

Initialisieren Sie ein 1-D-Array und formen Sie es an Ort und Stelle neu.

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

Ausgänge

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

DyND soll unter anderem eine NumPy-ähnliche Bibliothek für C++ sein. Dinge wie Rundfunk, Rechenoperatoren und Slicing funktionieren einwandfrei. Andererseits ist es immer noch sehr experimentell und viele Funktionen wurden noch nicht implementiert.

Hier ist eine einfache Implementierung des de Casteljau-Algorithmus in C++ unter Verwendung von DyND-Arrays:

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

Ich schrieb vor einiger Zeit ein Blog-Beitrag mit weiteren Beispielen und Vergleichen der Syntax für Fortran 90, DyND in C++ und NumPy in Python.

Haftungsausschluss: Ich bin einer der aktuellen DyND-Entwickler.

7
IanH

Eigen ist eine gute Bibliothek für lineare Algebra. 

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

Es ist recht einfach zu installieren, da es sich um eine reine Kopfbibliothek handelt. Es basiert auf einer Vorlage, um gut optimierten Code zu erzeugen. Es vektorisiert automatisch die Matrixoperationen.

Sie unterstützt auch koeffizientenweise Operationen, wie zum Beispiel die "Multiplikation pro Element" zwischen zwei Matrizen. Es ist was du brauchst

Blitz ++ unterstützt Arrays mit einer beliebigen Anzahl von Achsen, während Armadillo nur bis zu drei (Vektoren, Matrizen und Würfel) unterstützt. Eigen unterstützt nur Vektoren und Matrizen (keine Würfel). Der Nachteil ist, dass Blitz ++ keine linearen Algebra-Funktionen außerhalb der eingangsseitigen Grundoperationen und der Tensor-Kontraktionen aufweist. Die Entwicklung scheint sich vor einiger Zeit verlangsamt zu haben, aber vielleicht liegt das nur daran, dass die Bibliothek das tut, was sie tut, und dass nicht viele Änderungen erforderlich sind.

2
Dan Stahlke

VIGRA enthält eine gute N-dimensionale Array-Implementierung:

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

Ich benutze es ausgiebig und finde es sehr einfach und effektiv. Es ist auch nur Header, also sehr einfach in Ihre Entwicklungsumgebung zu integrieren. Es ist das Beste, was ich mit der Verwendung von NumPy in Bezug auf seine API kennengelernt habe. 

Der Hauptnachteil ist, dass es nicht so häufig verwendet wird wie die anderen, so dass Sie online kaum Hilfe finden. Das, und es ist unbequem benannt (versuchen Sie danach zu suchen!)

1
Martin

Eigen ist eine Vorlagenbibliothek für lineare Algebra (Matrizen, Vektoren usw.). Es ist nur ein Header und kann kostenlos verwendet werden (LGPL).

0
Claudio

Das GSL ist großartig, es macht alles, was Sie fragen, und vieles mehr. Es ist jedoch unter der GPL lizenziert.

0
Matt Phillips