NumCpp  2.7.0
A Templatized Header Only C++ Implementation of the Python NumPy Library
mean.hpp
Go to the documentation of this file.
1 #pragma once
29 
31 #include "NumCpp/Core/Shape.hpp"
32 #include "NumCpp/Core/Types.hpp"
33 #include "NumCpp/NdArray.hpp"
34 
35 #include <complex>
36 #include <numeric>
37 
38 namespace nc
39 {
40  //===========================================================================
41  // Method Description:
51  template<typename dtype>
52  NdArray<double> mean(const NdArray<dtype>& inArray, Axis inAxis = Axis::NONE)
53  {
55 
56  switch (inAxis)
57  {
58  case Axis::NONE:
59  {
60  auto sum = std::accumulate(inArray.cbegin(), inArray.cend(), 0.0);
61  NdArray<double> returnArray = { sum /= static_cast<double>(inArray.size()) };
62 
63  return returnArray;
64  }
65  case Axis::COL:
66  {
67  NdArray<double> returnArray(1, inArray.numRows());
68  for (uint32 row = 0; row < inArray.numRows(); ++row)
69  {
70  auto sum = std::accumulate(inArray.cbegin(row), inArray.cend(row), 0.0);
71  returnArray(0, row) = sum / static_cast<double>(inArray.numCols());
72  }
73 
74  return returnArray;
75  }
76  case Axis::ROW:
77  {
78  NdArray<dtype> transposedArray = inArray.transpose();
79  NdArray<double> returnArray(1, transposedArray.numRows());
80  for (uint32 row = 0; row < transposedArray.numRows(); ++row)
81  {
82  auto sum = static_cast<double>(std::accumulate(transposedArray.cbegin(row), transposedArray.cend(row), 0.0));
83  returnArray(0, row) = sum / static_cast<double>(transposedArray.numCols());
84  }
85 
86  return returnArray;
87  }
88  default:
89  {
90  THROW_INVALID_ARGUMENT_ERROR("Unimplemented axis type.");
91  return {};
92  }
93  }
94  }
95 
96  //============================================================================
97  // Method Description:
107  template<typename dtype>
108  NdArray<std::complex<double>> mean(const NdArray<std::complex<dtype>>& inArray, Axis inAxis = Axis::NONE)
109  {
111 
112  switch (inAxis)
113  {
114  case Axis::NONE:
115  {
116  auto sum = std::accumulate(inArray.cbegin(), inArray.cend(), std::complex<double>(0.0));
117  NdArray<std::complex<double>> returnArray = { sum /= std::complex<double>(inArray.size()) };
118 
119  return returnArray;
120  }
121  case Axis::COL:
122  {
123  NdArray<std::complex<double>> returnArray(1, inArray.numRows());
124  for (uint32 row = 0; row < inArray.numRows(); ++row)
125  {
126  auto sum = std::accumulate(inArray.cbegin(row), inArray.cend(row), std::complex<double>(0.0));
127  returnArray(0, row) = sum / std::complex<double>(inArray.numCols());
128  }
129 
130  return returnArray;
131  }
132  case Axis::ROW:
133  {
134  NdArray<std::complex<double>> transposedArray = inArray.transpose();
135  NdArray<std::complex<double>> returnArray(1, transposedArray.numRows());
136  for (uint32 row = 0; row < transposedArray.numRows(); ++row)
137  {
138  auto sum = std::accumulate(transposedArray.cbegin(row), transposedArray.cend(row),
139  std::complex<double>(0.0));
140  returnArray(0, row) = sum / std::complex<double>(transposedArray.numCols());
141  }
142 
143  return returnArray;
144  }
145  default:
146  {
147  THROW_INVALID_ARGUMENT_ERROR("Unimplemented axis type.");
148  return {}; // get rid of compiler warning
149  }
150  }
151  }
152 } // namespace nc
#define THROW_INVALID_ARGUMENT_ERROR(msg)
Definition: Error.hpp:36
#define STATIC_ASSERT_ARITHMETIC(dtype)
Definition: StaticAsserts.hpp:37
uint32 numCols() const noexcept
Definition: NdArrayCore.hpp:3418
size_type size() const noexcept
Definition: NdArrayCore.hpp:4296
const_iterator cbegin() const noexcept
Definition: NdArrayCore.hpp:1216
uint32 numRows() const noexcept
Definition: NdArrayCore.hpp:3430
NdArray< dtype > transpose() const
Definition: NdArrayCore.hpp:4629
const_iterator cend() const noexcept
Definition: NdArrayCore.hpp:1524
Definition: Coordinate.hpp:45
Axis
Enum To describe an axis.
Definition: Types.hpp:46
NdArray< dtype > sum(const NdArray< dtype > &inArray, Axis inAxis=Axis::NONE)
Definition: sum.hpp:46
NdArray< double > mean(const NdArray< dtype > &inArray, Axis inAxis=Axis::NONE)
Definition: mean.hpp:52
std::uint32_t uint32
Definition: Types.hpp:40