C ++ के लिए NumPy शैली सरणियाँ? [बन्द है]


84

क्या कोई C ++ (या C) लिबास है जिसमें स्लाइसिंग, वेक्टराइज्ड ऑपरेशंस के लिए सपोर्ट के साथ न्यूमप जैसे एरर हैं, जो कंटेंट-बाय-एलिमेंट आदि को जोड़ते और घटाते हैं?



1
जहां तक ​​मुझे पता है कि खस्ता LAPACK का उपयोग करता है । जबकि यह फोरट्रान में लिखा गया है, वहाँ c ++ बाइंडिंग उपलब्ध हैं। हालांकि उन दोनों में से किसी का भी इस्तेमाल नहीं किया।
वू

NumPy के लिए हाल ही में C ++ इंटरफ़ेस है, जिसे ArmaNpy कहा जाता है ।
mtall

1
मैं अभी तक टिप्पणियों में Boost.MultiArray नहीं देख सकता
दिमित्री लेडेंटसोव

आप पायथन को एम्बेड करने की कोशिश कर सकते हैं और वास्तव में उस खसरे का उपयोग कर सकते हैं जिसे एक नए पुस्तकालय को सीखने की आवश्यकता नहीं होने का फायदा होगा, हालांकि यह C / C ++ पुस्तकालय का उपयोग करने की तुलना में धीमा होगा।
केविन

जवाबों:


61

यहां कई मुफ्त सॉफ़्टवेयर हैं जो आपकी आवश्यकताओं के अनुरूप हो सकते हैं।

  1. जीएनयू वैज्ञानिक पुस्तकालय इस प्रकार सी में लिखा एक GPL सॉफ्टवेयर है, यह एक सी की तरह आवंटन और प्रोग्रामिंग (संकेत, आदि) के रास्ते है। GSLwrap के साथ , आप GSL का उपयोग करते समय, प्रोग्रामिंग का C ++ तरीका पा सकते हैं। GSL में BLAS कार्यान्वयन है, लेकिन आप डिफ़ॉल्ट CBLAS के बजाय ATLAS का उपयोग कर सकते हैं , यदि आप और भी अधिक प्रदर्शन चाहते हैं।

  2. बढ़ावा / uBLAS पुस्तकालय एक बीएसएल पुस्तकालय, सी ++ में लिखा और एक बढ़ावा पैकेज के रूप में वितरित है। यह एक सी ++ है - बीएलएएस मानक को लागू करने का तरीका। uBLAS कुछ रैखिक बीजगणित कार्यों के साथ आता है, और ATLAS के लिए एक प्रयोगात्मक बाध्यकारी है

  3. eigen एक रैखिक बीजगणित पुस्तकालय है जो C ++ में लिखा गया है, जिसे MPL2 लाइसेंस (संस्करण 3.1.1 से शुरू) या LGPL3 / GPL2 (पुराने संस्करणों) के तहत वितरित किया गया है। यह प्रोग्रामिंग का C ++ तरीका है, लेकिन दो अन्य (अधिक एल्गोरिदम और डेटा संरचनाएं उपलब्ध हैं) की तुलना में अधिक एकीकृत है। डेगनो मानक बीएलएएस एपीआई का पालन नहीं करते हुए ऊपर दिए गए बीएलएएस कार्यान्वयनों की तुलना में ईजन का दावा अधिक तेज़ है। Eigen समानांतर कार्यान्वयन पर बहुत अधिक प्रयास नहीं करता है।

  4. आर्मडिलो C ++ के लिए LGPL3 लाइब्रेरी है। इसमें LAPACK (numpy द्वारा उपयोग की जाने वाली लाइब्रेरी) के लिए बाइंडिंग है । यह पुनरावर्ती टेम्प्लेट और टेम्प्लेट मेटा-प्रोग्रामिंग का उपयोग करता है, जो एक अच्छा बिंदु है (मुझे नहीं पता कि क्या अन्य पुस्तकालय भी ऐसा कर रहे हैं?)।

  5. xtensor एक C ++ लाइब्रेरी है जो BSD लाइसेंस प्राप्त है। यह A C ++ API को बहुत अधिक NumPy के समान प्रदान करता है। एक धोखा पत्र के लिए https://xtensor.readthedocs.io/en/latest/numpy.html देखें ।

ये विकल्प वास्तव में अच्छे हैं यदि आप केवल डेटा संरचना और बुनियादी रैखिक बीजगणित प्राप्त करना चाहते हैं। शैली, लाइसेंस या sysadmin चुनौतियों के बारे में अपने स्वाद के आधार पर (LAPACK जैसी बड़ी लाइब्रेरी स्थापित करना मुश्किल हो सकता है), आप अपनी आवश्यकताओं के अनुसार सबसे अच्छा सूट चुन सकते हैं।


16
मानो या न मानो, मेरा जवाब मेरी अपनी खोज का परिणाम है, कुछ महीने पहले। मैं विश्वास कर रहा था कि मुझे अपनी पसंद बनाने में मदद करने वाले informations को इकट्ठा करना कुछ दिलचस्पी का होगा। मुझे यकीन नहीं है कि यह उत्तर देने में बेहतर है कि कई informations फैले हों। यदि आप कार्यकुशलता से अधिक नैतिकता का अनुभव करते हैं तो भी आप सभी को उभार सकते हैं।
नोजान

19
अफसोस की बात है, इनमें से कोई भी सामान्य और सुविधाजनक के रूप में कुछ भी प्रदान नहीं करता है। Numpy सरणियाँ मनमाना-आयामी हैं और जैसी a[:4,::-1,:,19] = b[None,-5:,None]या a[a>5]=0समान चीज़ों का समर्थन करती हैं , साथ ही साथ उपलब्ध सरणी और सूचकांक हेरफेर कार्यों का एक बड़ा समूह है। मैं वास्तव में आशा करता हूं कि कोई व्यक्ति किसी दिन सी ++ के लिए ऐसा कुछ करे।
अमौरिया

2
OpenCV में एक मैट्रिक्स प्रकार भी होता है जिसमें मनमाना आयामी आकार हो सकता है; कॉलम / पंक्ति पर्वतमाला (के a.colRange(4,7).rowRange(4,8)लिए a[4:7,4,8]) और स्थिति मुखौटा (के a.setTo(cv::Scalar(0), a>5)लिए a[a>5]=0)
xaedes

3
@amaurea नीचे xtensor पर उत्तर की जाँच करता है, जो उपरोक्त सभी को सक्षम करता है।
मात्रा

1
मुझे हाल ही में एक परियोजना में Eigen का उपयोग करना पड़ा है और मुझे यह कहना है कि जबकि यह कुशल लगता है, वाक्य रचना बिल्कुल भयानक है। उस अद्भुत पायथन स्लाइसिंग सिंटैक्स में से कोई भी उपलब्ध नहीं है। उदाहरण के लिए, यदि आपके पास 1D वेक्टर x है और पहले n तत्वों में हेरफेर करना चाहते हैं, तो आपको x.head (n) का उपयोग करना होगा। एक्स के अनियंत्रित स्लाइस में हेरफेर करने के बारे में भी न पूछें, आपको ऐसा करने के लिए एक अच्छे पुराने लूप की आवश्यकता होगी। यह कई क्लंकी और असुविधाजनक उदाहरणों में से एक है जिसका मैं नाम रख सकता हूं।
एलेक्स

54

Xtensor बाहर की कोशिश करो । (देखें एक्सपेन्सर चीट शीट को न्यूपी ।)

xtensor एक C ++ लाइब्रेरी है जो बहु-आयामी सरणी अभिव्यक्तियों के साथ संख्यात्मक विश्लेषण के लिए है।

xtensor प्रदान करता है

  • एक एक्सटेंसिबल एक्सप्रेशन सिस्टम, जो सुपी-स्टाइल ब्रॉडकास्टिंग को सक्षम करता है।
  • C ++ मानक पुस्तकालय के मुहावरों के बाद एक एपीआई।
  • उपकरण सरणी अभिव्यक्तियों में हेरफेर करने और xtensor पर निर्माण करने के लिए।

उदाहरण

2-डी सरणी को इनिशियलाइज़ करें और इसकी एक पंक्ति और 1-डी सरणी की गणना करें।

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

2
@Llamageddon क्या आपको लगता है कि यह चयनित उत्तर होना चाहिए?
क्वांट

7

DyND को C ++ के लिए एक NumPy जैसी लाइब्रेरी, अन्य चीजों के साथ बनाया गया है। प्रसारण, अंकगणित संचालक, और सभी काम ठीक करने जैसी चीजें। दूसरी ओर, यह अभी भी बहुत प्रयोगात्मक है और कई सुविधाओं को अभी तक लागू नहीं किया गया है।

यहाँ सी + + में डी Castelnau कलन विधि का एक सरल कार्यान्वयन 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;
}

मैंने फोरट्रान 90, सी ++ में डीआईएनडीआर और पायथन में न्यूमिप के लिए वाक्यविन्यास की तुलना और उदाहरणों के साथ थोड़ी देर पहले एक ब्लॉग पोस्ट लिखा था ।

अस्वीकरण: मैं वर्तमान DyND डेवलपर्स में से एक हूं।


3

Eigen एक अच्छा रैखिक बीजगणित पुस्तकालय है।

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

हेडर-ओनली लाइब्रेरी के बाद से इसे स्थापित करना काफी आसान है। यह अच्छी तरह से अनुकूलित कोड उत्पन्न करने के लिए टेम्पलेट पर निर्भर करता है। यह स्वचालित रूप से मैट्रिक्स ऑपरेशन को वेक्टर करता है।

यह उदाहरण के लिए दो मेट्रिसेस के बीच "प्रति गुणन गुणन" जैसे गुणांक वार संचालन का भी पूर्ण समर्थन करता है। यह वही है जो आपको चाहिए?


3
हालांकि Eigen का सिंटैक्स बहुत भयानक है। Numpy में आपके द्वारा पाया जाने वाला कोई भी चिकनी स्लाइसिंग सिंटैक्स नहीं है। और यह एक सामान्य एन-आयामी सरणी पुस्तकालय नहीं है, यह केवल 1 डी वैक्टर और 2 डी मैट्रीस के लिए अधिक है। तथ्य यह है कि उनके पास 1d सरणियों के लिए वेक्टरएक्सडीडी है और 2 डी सरणियों के लिए मैट्रिक्सएक्सडीडी मुझे पहले से ही पीछे कर देता है।
एलेक्स

2

ब्लिट्ज ++ अक्षों की एक मनमानी संख्या के साथ सरणियों का समर्थन करता है, जबकि आर्मडिलो केवल तीन (वैक्टर, मैट्रिस और क्यूब्स) का समर्थन करता है। ईजन केवल वैक्टर और मैट्रीस (क्यूब्स नहीं) का समर्थन करता है। नकारात्मक पक्ष यह है कि ब्लिट्ज ++ में बुनियादी एंट्रीवाइज ऑपरेशंस और टेंसर संकुचन से परे रैखिक बीजगणित फ़ंक्शन नहीं हैं। लगता है कि विकास कुछ समय पहले काफी धीमा हो गया था, लेकिन शायद ऐसा सिर्फ इसलिए है क्योंकि पुस्तकालय वही करता है जो वह करता है और कई बदलाव करने की जरूरत नहीं है।


2

xtensor अच्छा है, लेकिन मैंने c ++ 20 के साथ एक खिलौना परियोजना के रूप में खुद को एक मिनी-लाइब्रेरी लिखना समाप्त कर दिया, जबकि इंटरफ़ेस को यथासंभव सरल रखने की कोशिश कर रहा था। यहाँ यह है: https://github.com/gbalduzz/NDArray

उदाहरण कोड:

using namespace nd;
NDArray<int, 2> m(3, 3); // 3x3 matrix
m = 2; // assign 2 to all
m(-1, all) = 1; // assign 1 to the last row.

auto tile = m(range{1, end}, range{1, end}); // 2x2 tile
std::sort(tile.begin(), tile.end());

std::cout << m; // prints [[2, 2, 2], [2, 1, 1], [1, 2, 2]]

यह फैंसी अंकगणितीय ऑपरेटरों को एक साथ कई ऑपरेशनों को ध्वस्त करने की सुविधा प्रदान नहीं करता है, फिर भी, लेकिन आप मनमाने ढंग से लंबोदा को समान आकार के साथ दसियों के सेट पर प्रसारित कर सकते हैं, या आलसी रूप से मूल्यांकन किए गए अंकगणितीय ऑपरेटरों का उपयोग कर सकते हैं।

मुझे बताएं कि आप इंटरफ़ेस के बारे में क्या सोचते हैं और अन्य विकल्पों के साथ इसकी तुलना कैसे करते हैं, और अगर इससे कोई उम्मीद है, तो आप किस तरह के संचालन को लागू करना चाहते हैं।

मुफ्त लाइसेंस और कोई निर्भरता नहीं!

परिशिष्ट: मैं xtensor को ठीक से संकलित करने और चलाने में कामयाब रहा, और इसका परिणाम यह है कि विचारों पर (2 से 3X) पुनरावृति होने पर मेरी लाइब्रेरी काफी तेज है


1

VIGRA में एक अच्छा एन-आयामी सरणी कार्यान्वयन शामिल है:

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

मैं इसे बड़े पैमाने पर उपयोग करता हूं, और इसे बहुत सरल और प्रभावी लगता हूं। यह केवल हेडर है, इसलिए आपके विकास के वातावरण में एकीकृत करना बहुत आसान है। यह मैं एपीआई के रूप में NumPy का उपयोग करने के लिए आया हूँ निकटतम बात है।

मुख्य नकारात्मक पक्ष यह है कि यह दूसरों के रूप में व्यापक रूप से उपयोग नहीं किया जाता है, इसलिए आपको ऑनलाइन मदद नहीं मिलेगी। यह, और यह अजीब नाम है (इसके लिए खोज करने का प्रयास करें!)



1

यह एक पुराना सवाल है। फिर भी जवाब देने जैसा लगा। सोचा कई मदद कर सकते हैं, विशेष रूप से pydevs C ++ में कोडिंग।

यदि आप पहले से ही अजगर सुन्न के साथ काम कर चुके हैं, तो NumCpp एक शानदार विकल्प है। यह वाक्य रचना में न्यूनतर है और पाई सुन्न के समान कार्य या विधियां प्राप्त की है।

तुलना रीडमी दस्तावेज़ में हिस्सा भी बहुत बहुत शांत है।

NumCpp

nc::NdArray<int> arr = {{4, 2}, {9, 4}, {5, 6}};
arr.reshape(5, 3);
arr.astype<double>();

0

Eigen रैखिक बीजगणित (मैट्रिक्स, वैक्टर ...) के लिए एक टेम्पलेट लाइब्रेरी है। यह केवल हेडर और मुफ्त (LGPL) का उपयोग करने के लिए है।


0

यदि आप छवि प्रसंस्करण या तंत्रिका नेटवर्क के लिए बहुआयामी सरणी (जैसे संख्यात्मक) का उपयोग करना चाहते हैं, तो आप OpenCV cv::Matटन के साथ इमेज प्रोसेसिंग एल्गोरिदम का उपयोग कर सकते हैं । यदि आप केवल मैट्रिक्स ऑपरेशन के लिए इसका उपयोग करना चाहते हैं, तो आपको आकार कम करने और छोटे OpenCV लाइब्रेरी रखने के लिए संबंधित ऑप्सनव मॉड्यूल का संकलन करना होगा।

cv::Mat(मैट्रिक्स) एक एन-आयामी सरणी है जिसका उपयोग विभिन्न प्रकार के डेटा को स्टोर करने के लिए किया जा सकता है, जैसे RGB, HSV या ग्रेस्केल इमेज, असली या जटिल मान वाले वैक्टर, अन्य मैट्रिसेस आदि।

एक Mat में निम्न जानकारी होती है: width, height, type, channels, data, flags, datastart, dataendइत्यादि।

मैट्रिक्स हेरफेर के लिए इसमें कई तरीके हैं। बोनस आप CUDA कोर पर और फिर बना सकते हैं cv::cuda::GpuMat

विचार करें कि मैं 10 पंक्तियों, 20 स्तंभों के साथ एक मैट्रिक्स बनाना चाहता हूं, CV_32FC3 टाइप करें:

int R = 10, C = 20;
Mat m1; 
m1.create(R, C, CV_32FC3); //creates empty matrix

Mat m2(cv::Size(R, C), CV_32FC3); // creates a matrix with R rows, C columns with data type T where R and C are integers, 

Mat m3(R, C, CV_32FC3); // same as m2

बक्शीश:

बस मैट्रिक्स ऑपरेशन के लिए छोटे और कॉम्पैक्ट ओपन लाइब्रेरी का संकलन करें। इस लेख में बताए गए तरीकों में से एक बार।

या

निम्नलिखित cmake कमांड का उपयोग करके opencv सोर्स कोड संकलित करें:

$ git clone https://github.com/opencv/opencv.git
$ cd opencv
$ git checkout <version you want to checkout>
$ mkdir build
$ cd build
$ cmake -D WITH_CUDA=OFF -D WITH_MATLAB=OFF -D BUILD_ANDROID_EXAMPLES=OFF -D BUILD_DOCS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -DANDROID_STL=c++_shared -DBUILD_SHARED_LIBS=ON -D BUILD_opencv_objdetect=OFF -D BUILD_opencv_video=OFF -D BUILD_opencv_videoio=OFF -D BUILD_opencv_features2d=OFF -D BUILD_opencv_flann=OFF -D BUILD_opencv_highgui=OFF -D BUILD_opencv_ml=OFF -D BUILD_opencv_photo=OFF -D BUILD_opencv_python=OFF -D BUILD_opencv_shape=OFF -D BUILD_opencv_stitching=OFF -D BUILD_opencv_superres=OFF -D BUILD_opencv_ts=OFF -D BUILD_opencv_videostab=OFF -D BUILD_opencv_dnn=OFF -D BUILD_opencv_imgproc=OFF ..
$ make -j $nproc
$ sudo make install

इस उदाहरण का प्रयास करें:

 #include "opencv2/core.hpp"
 #include<iostream>

 int main()
 {
     std::cout << "OpenCV Version " << CV_VERSION << std::endl;

     int R = 2, C = 4;
     cv::Mat m1;
     m1.create(R, C, CV_32FC1); //creates empty matrix

     std::cout << "My Mat : \n" << m1 << std::endl;
 }

निम्नलिखित आदेश के साथ कोड संकलित करें:

$ g++ -std=c++11 opencv_mat.cc -o opencv_mat `pkg-config --libs opencv` `pkg-config --cflags opencv`

निष्पादन योग्य चलाएँ:

$ ./opencv_mat

OpenCV Version 3.4.2
My Mat :
[0, 0, 0, 0;
 0, 0, 0, 0]

-1

GSL महान है, यह आप पूछ और भी बहुत कुछ कर रहे हैं के सभी नहीं करता है। यह हालांकि GPL के तहत लाइसेंस प्राप्त है।


-1

जबकि GLM को ओपनजीएल और GLSL के साथ आसानी से मेष करने के लिए डिज़ाइन किया गया है, यह पूरी तरह से कार्यात्मक हेडर है केवल सी + + के लिए गणित पुस्तकालय जिसमें इंटरफेस का बहुत सहज सेट है।

यह वेक्टर और मैट्रिक्स प्रकारों के साथ-साथ उन पर विभिन्न कार्यों की घोषणा करता है।

दो मैट्रिसेस को गुणा करना एक सरल (M1 * M2) है। दो वैक्टर (V1- V2) घटाना।

वैक्टर या मेट्रिसेस में सम्‍मिलित मान समान रूप से सरल है। उदाहरण के लिए एक vec3 वेक्टर घोषित करने के बाद, कोई भी वेक्टर के साथ अपने पहले तत्व तक पहुंच सकता है। इसकी जांच - पड़ताल करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.