1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// Copyright 2014-2016 bluss and ndarray developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

//! Methods for two-dimensional arrays.
use crate::imp_prelude::*;

/// # Methods For 2-D Arrays
impl<A, S> ArrayBase<S, Ix2>
where
    S: RawData<Elem = A>,
{
    /// Return an array view of row `index`.
    ///
    /// **Panics** if `index` is out of bounds.
    ///
    /// ```
    /// use ndarray::array;
    /// let array = array![[1., 2.], [3., 4.]];
    /// assert_eq!(array.row(0), array![1., 2.]);
    /// ```
    pub fn row(&self, index: Ix) -> ArrayView1<'_, A>
    where
        S: Data,
    {
        self.index_axis(Axis(0), index)
    }

    /// Return a mutable array view of row `index`.
    ///
    /// **Panics** if `index` is out of bounds.
    ///
    /// ```
    /// use ndarray::array;
    /// let mut array = array![[1., 2.], [3., 4.]];
    /// array.row_mut(0)[1] = 5.;
    /// assert_eq!(array, array![[1., 5.], [3., 4.]]);
    /// ```
    pub fn row_mut(&mut self, index: Ix) -> ArrayViewMut1<'_, A>
    where
        S: DataMut,
    {
        self.index_axis_mut(Axis(0), index)
    }

    /// Return the number of rows (length of `Axis(0)`) in the two-dimensional array.
    ///
    /// ```
    /// use ndarray::array;
    /// let array = array![[1., 2.], [3., 4.]];
    /// assert_eq!(array.nrows(), 2usize);
    /// ```
    pub fn nrows(&self) -> usize {
        self.len_of(Axis(0))
    }

    /// Return the number of rows (length of `Axis(0)`) in the two-dimensional array.
    #[deprecated(note = "Renamed to .nrows(), please use the new name")]
    pub fn rows(&self) -> usize {
        self.nrows()
    }

    /// Return an array view of column `index`.
    ///
    /// **Panics** if `index` is out of bounds.
    ///
    /// ```
    /// use ndarray::array;
    /// let array = array![[1., 2.], [3., 4.]];
    /// assert_eq!(array.column(0), array![1., 3.]);
    /// ```
    pub fn column(&self, index: Ix) -> ArrayView1<'_, A>
    where
        S: Data,
    {
        self.index_axis(Axis(1), index)
    }

    /// Return a mutable array view of column `index`.
    ///
    /// **Panics** if `index` is out of bounds.
    ///
    /// ```
    /// use ndarray::array;
    /// let mut array = array![[1., 2.], [3., 4.]];
    /// array.column_mut(0)[1] = 5.;
    /// assert_eq!(array, array![[1., 2.], [5., 4.]]);
    /// ```
    pub fn column_mut(&mut self, index: Ix) -> ArrayViewMut1<'_, A>
    where
        S: DataMut,
    {
        self.index_axis_mut(Axis(1), index)
    }

    /// Return the number of columns (length of `Axis(1)`) in the two-dimensional array.
    ///
    /// ```
    /// use ndarray::array;
    /// let array = array![[1., 2.], [3., 4.]];
    /// assert_eq!(array.ncols(), 2usize);
    /// ```
    pub fn ncols(&self) -> usize {
        self.len_of(Axis(1))
    }

    /// Return the number of columns (length of `Axis(1)`) in the two-dimensional array.
    #[deprecated(note = "Renamed to .ncols(), please use the new name")]
    pub fn cols(&self) -> usize {
        self.ncols()
    }

    /// Return true if the array is square, false otherwise.
    ///
    /// # Examples
    /// Sqaure:
    /// ```
    /// use ndarray::array;
    /// let array = array![[1., 2.], [3., 4.]];
    /// assert!(array.is_square());
    /// ```
    /// Not sqaure:
    /// ```
    /// use ndarray::array;
    /// let array = array![[1., 2., 5.], [3., 4., 6.]];
    /// assert!(!array.is_square());
    /// ```
    pub fn is_square(&self) -> bool {
        self.nrows() == self.ncols()
    }
}