DataArray#

class numpy::DataArray#

numpy C++ class.

Example#

#include <numpy/np_ndarray.h>
using namespace numpy;

// Use DataArray
DataArray obj;
// ... operations ...

Constructors#

Signature

Location

Example

DataArray(const numpy::NDArray<T>& data, const std::vector<std::string>& dims =

df_xarray.h:165

DataArray(const std::vector<T>& data, const std::string& dim_name = "dim_0", const std::optional<Coordinate>& coord = std::nullopt, const std::optional<std::string>& name = std::nullopt)

df_xarray.h:199

Array Creation#

Signature

Return Type

Location

Example

bool empty() const

bool

df_xarray.h:281

View

Indexing / Selection#

Signature

Return Type

Location

Example

T at(const std::vector<size_t>& indices) const

T

df_xarray.h:319

View

const std::map<std::string, std::string>& attrs() const

const std::map<std::string, std::string>&

df_xarray.h:238

std::map<std::string, std::string>& attrs()

std::map<std::string, std::string>&

df_xarray.h:239

I/O#

Signature

Return Type

Location

Example

std::string to_string() const

std::string

df_xarray.h:337

View

Other Methods#

Signature

Return Type

Location

Example

const Coordinate& coord(const std::string& name) const

const Coordinate&

df_xarray.h:297

const std::map<std::string, Coordinate>& coords() const

const std::map<std::string, Coordinate>&

df_xarray.h:232

std::map<std::string, Coordinate>& coords()

std::map<std::string, Coordinate>&

df_xarray.h:233

const std::vector<std::string>& dims() const

const std::vector<std::string>&

df_xarray.h:227

bool has_coord(const std::string& name) const

bool

df_xarray.h:290

std::optional<std::string> name() const

std::optional<std::string>

df_xarray.h:244

View

size_t ndim() const

size_t

df_xarray.h:254

View

void set_coord(const std::string& name, const Coordinate& coord)

void

df_xarray.h:308

void set_name(const std::string& name)

void

df_xarray.h:249

std::vector<size_t> shape() const

std::vector<size_t>

df_xarray.h:259

View

size_t size() const

size_t

df_xarray.h:264

View

std::map<std::string, size_t> sizes() const

std::map<std::string, size_t>

df_xarray.h:269

View

const numpy::NDArray<T>& values() const

const numpy::NDArray<T>&

df_xarray.h:221

View

numpy::NDArray<T>& values()

numpy::NDArray<T>&

df_xarray.h:222

View

Code Examples#

The following examples are extracted from the test suite.

empty (np_test_1_all.cpp:6316)
6306}
6307
6308void test_data_generator_emptyBenchmarkSorting() {
6309    std::cout << "========= test_data_generator_empty =======================";
6310
6311    DataGenerator<int> gen(42);
6312
6313    // Test empty data generation
6314    std::vector<int> data = gen.generate(0, DataPattern::RANDOM);
6315
6316    if (!(data.empty())) {
6317        std::string description = std::string("test_data_generator_emptyBenchmarkSorting():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(data.empty())";
6318        std::cout << std::string("[FAIL] ") + description << std::endl;
6319        throw std::runtime_error(description);
6320    }
6321
6322    // std::cout << "Empty data generation test passed" << std::endl;
6323
6324    std::cout << " -> tests passed" << std::endl;
6325}
at (np_test_1_all.cpp:144)
134    array.setElementAt({0, 0}, 1);
135    array.setElementAt({0, 1}, 2);
136    array.setElementAt({0, 2}, 3);
137    array.setElementAt({1, 1}, 5);
138    array.setElementAt({2, 2}, 9);
139
140    // std::cout << "Array after setting elements:" << std::endl;
141    //array.printArray();
142
143    // std::cout << "Element at (1,1): " << array.getElementAt({1, 1}) << std::endl;
144    // std::cout << "Element at (2,2): " << array.getElementAt({2, 2});
145
146    std::cout << " -> tests passed" << std::endl;
147}
148
149void testArithmetic() {
150    std::cout << "========= testArithmeticOperations =======================";
151
152    auto array1 = createFloat32Array({2, 2}, 5.0f);
153    auto array2 = createFloat32Array({2, 2}, 3.0f);
to_string (np_test_1_all.cpp:454)
444    // Modify through different views
445    view1.setElementAt({0, 0}, 100);
446    view2.setElementAt({2, 1}, 200);  // This is (1, 2) in original
447    view3.setElementAt({0, 0}, 300);  // This is (1, 1) in original
448
449    // std::cout << "After modifications through multiple views:" << std::endl;
450    //original.printArray();
451
452    // Verify all changes are reflected
453    if (!(original.getElementAt({0, 0}) == 100)) {
454        std::string description = std::string("testAdvancedViewLifecycle():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(original.getElementAt({0, 0}) == 100)";
455        std::cout << std::string("[FAIL] ") + description << std::endl;
456        throw std::runtime_error(description);
457    }
458    if (!(original.getElementAt({1, 2}) == 200)) {
459        std::string description = std::string("testAdvancedViewLifecycle():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(original.getElementAt({1, 2}) == 200)";
460        std::cout << std::string("[FAIL] ") + description << std::endl;
461        throw std::runtime_error(description);
462    }
463    if (!(original.getElementAt({1, 1}) == 300)) {
464        std::string description = std::string("testAdvancedViewLifecycle():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(original.getElementAt({1, 1}) == 300)";
name (np_test_1_all.cpp:24865)
24855      uint64_t before_restore = rng.next_uint64();
24856      rng.set_state(state);
24857      uint64_t after_restore = rng.next_uint64();
24858
24859      if (before_restore != after_restore) {
24860        std::cout << "  [FAIL] : in np_test_bitgen_mt19937() : state restore failed";
24861        throw std::runtime_error("np_test_bitgen_mt19937 failed: state");
24862      }
24863
24864      // Test name
24865      if (rng.name() != "MT19937") {
24866        std::cout << "  [FAIL] : in np_test_bitgen_mt19937() : incorrect name";
24867        throw std::runtime_error("np_test_bitgen_mt19937 failed: name");
24868      }
24869
24870      std::cout << " -> tests passed" << std::endl;
24871    }
24872
24873    // ============================================================================
24874    // PCG64 TESTS
24875    // ============================================================================
ndim (np_test_2_all.cpp:3526)
3516    void testArrayInfo() {
3517      std::cout << "Testing array information functions...\n";
3518
3519      // Test basic info functions
3520      auto arr = createFloat64Array({ 2, 3, 4 });
3521      for (size_t i = 0; i < arr.getSize(); ++i) {
3522        arr.setElementAt({ i / 12, (i / 4) % 3, i % 4 }, static_cast<double>(i));
3523      }
3524
3525      // Test ndim
3526      if (!(ndim(arr) == 3)) {
3527          std::string description = std::string("testArrayInfo():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(ndim(arr) == 3)";
3528          std::cout << std::string("[FAIL] ") + description << std::endl;
3529          throw std::runtime_error(description);
3530      }
3531
3532      // Test size
3533      if (!(size(arr) == 24)) {
3534          std::string description = std::string("testArrayInfo():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(size(arr) == 24)";
3535          std::cout << std::string("[FAIL] ") + description << std::endl;
3536          throw std::runtime_error(description);
shape (np_test_1_all.cpp:3751)
3741    }
3742
3743    for (size_t j = 0; j < 3; ++j) {
3744        arr3.setElementAt({0, j}, static_cast<double>((j + 1) * 100));  // [100, 200, 300]
3745    }
3746
3747    // Broadcast all arrays together
3748    std::vector<NDArray<double>> arrays = {arr1, arr2, arr3};
3749    auto broadcasted = broadcast_arrays(arrays);
3750
3751    // All should have shape (2, 3)
3752    for (const auto& arr : broadcasted) {
3753        if (!((arr.getShape() == std::vector<size_t>{2, 3}))) {
3754            std::string description = std::string("test_broadcast_arrays():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !((arr.getShape() == std::vector<size_t>{2, 3}))";
3755            std::cout << std::string("[FAIL] ") + description << std::endl;
3756            throw std::runtime_error(description);
3757        }
3758    }
3759
3760    // Check values
3761    if (!(broadcasted[0].getElementAt({0, 1}) == 2.0)) {
size (np_test_1_all.cpp:47)
37using namespace numpy;
38using namespace numpy::benchmark;
39using namespace numpy::char_;
40
41// Helper functions for array comparison tests
42namespace {
43    const double TOLERANCE = 1e-10;
44
45    bool allTrue(const NDArray<bool>& arr) {
46        std::vector<size_t> indices(arr.getShape().size(), 0);
47        do {
48            if (!arr.getElementAt(indices)) {
49                return false;
50            }
51        } while (incrementIndices(indices, arr.getShape()));
52        return true;
53    }
54
55    bool allFalse(const NDArray<bool>& arr) {
56        std::vector<size_t> indices(arr.getShape().size(), 0);
sizes (np_test_3_all.cpp:11536)
11526          std::string description = std::string("np_test_io_npz_compressed():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(std::abs(loaded_uncompressed.getElementAt({ 500 }) - 500.0) < 1e-10)";
11527          std::cout << std::string("[FAIL] ") + description << std::endl;
11528          throw std::runtime_error(description);
11529      }
11530      if (!(std::abs(loaded_compressed.getElementAt({ 500 }) - 500.0) < 1e-10)) {
11531          std::string description = std::string("np_test_io_npz_compressed():") + __FILE__ + ":" + std::to_string(__LINE__) + ": !(std::abs(loaded_compressed.getElementAt({ 500 }) - 500.0) < 1e-10)";
11532          std::cout << std::string("[FAIL] ") + description << std::endl;
11533          throw std::runtime_error(description);
11534      }
11535
11536      // Check file sizes (compressed should be smaller for large arrays)
11537      auto size_uncompressed = std::filesystem::file_size(filename_uncompressed);
11538      auto size_compressed = std::filesystem::file_size(filename_compressed);
11539
11540      // std::cout << "Uncompressed size: " << size_uncompressed << " bytes" << std::endl;
11541      // std::cout << "Compressed size: " << size_compressed << " bytes" << std::endl;
11542
11543      // Note: Compression ratio depends on data patterns
11544      // For sequential data like arange, we may not see much compression
11545      // std::cout << "[OK] Compressed save/load (with zlib)" << std::endl;
11546#else
values (np_test_1_all.cpp:15133)
15123        std::cout << " -> tests passed" << std::endl;
15124      }
15125      else {
15126        std::cout << "[FAIL] Where function failed" << std::endl;
15127        errors++;
15128      }
15129
15130      // Test 8: Clip function
15131      std::cout << "========= test_clip_function =======================" ;
15132
15133      numpy::NDArray<double> values({ 5 });
15134      values.setElementAt({ 0 }, -2.0);
15135      values.setElementAt({ 1 }, -1.0);
15136      values.setElementAt({ 2 }, 0.5);
15137      values.setElementAt({ 3 }, 2.0);
15138      values.setElementAt({ 4 }, 5.0);
15139      double min_val = -1.0;
15140      double max_val = 3.0;
15141
15142      auto clip_result = numpy::clip(values, min_val, max_val);
values (np_test_1_all.cpp:15133)
15123        std::cout << " -> tests passed" << std::endl;
15124      }
15125      else {
15126        std::cout << "[FAIL] Where function failed" << std::endl;
15127        errors++;
15128      }
15129
15130      // Test 8: Clip function
15131      std::cout << "========= test_clip_function =======================" ;
15132
15133      numpy::NDArray<double> values({ 5 });
15134      values.setElementAt({ 0 }, -2.0);
15135      values.setElementAt({ 1 }, -1.0);
15136      values.setElementAt({ 2 }, 0.5);
15137      values.setElementAt({ 3 }, 2.0);
15138      values.setElementAt({ 4 }, 5.0);
15139      double min_val = -1.0;
15140      double max_val = 3.0;
15141
15142      auto clip_result = numpy::clip(values, min_val, max_val);