fancy_indexing 1.0.3

numpy's fancy-indexing for Rust linear algebra crates
Documentation
use ndarray::Array2;

/// Function that rearranges a matrix using the specified row and column indices
///
/// # Arguments
/// - `matrix`: The input matrix (ndarray::Array2)
/// - `row_indices`: Row indices used for rearranging
/// - `col_indices`: Column indices used for rearranging
///
/// # Returns
/// A new matrix after rearrangement
#[allow(dead_code)]
pub fn rearrange_matrix<T>(
    matrix: &Array2<T>,
    row_indices: &[usize],
    col_indices: &[usize],
) -> Array2<T>
where
    T: Copy + Default,
{
    let rows = row_indices.len();
    let cols = col_indices.len();
    let mut result = Array2::default((rows, cols));

    for (new_row, &row) in row_indices.iter().enumerate() {
        for (new_col, &col) in col_indices.iter().enumerate() {
            result[(new_row, new_col)] = matrix[(row, col)];
        }
    }

    result
}

#[cfg(test)]
mod tests {
    use super::*;
    use ndarray::{Array2, arr2};

    #[test]
    fn test_rearrange_matrix_basic() {
        let matrix: Array2<i32> = arr2(&[[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
        let row_indices = [0, 1, 2];
        let col_indices = [2, 1, 0];

        let result = rearrange_matrix(&matrix, &row_indices, &col_indices);
        let expected: Array2<i32> = arr2(&[[3, 2, 1], [6, 5, 4], [9, 8, 7]]);

        assert_eq!(result, expected);
    }

    #[test]
    fn test_rearrange_matrix_partial() {
        let matrix: Array2<i32> = arr2(&[[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
        let row_indices = [0, 2];
        let col_indices = [2, 0];

        let result = rearrange_matrix(&matrix, &row_indices, &col_indices);
        let expected: Array2<i32> = arr2(&[[3, 1], [9, 7]]);

        assert_eq!(result, expected);
    }

    #[test]
    fn test_rearrange_matrix_single_element() {
        let matrix: Array2<i32> = arr2(&[[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
        let row_indices = [1];
        let col_indices = [1];

        let result = rearrange_matrix(&matrix, &row_indices, &col_indices);
        let expected: Array2<i32> = arr2(&[[5]]);

        assert_eq!(result, expected);
    }

    #[test]
    fn test_rearrange_matrix_with_duplicates() {
        let matrix: Array2<i32> = arr2(&[[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
        let row_indices = [0, 0, 2]; // 行0を2回参照
        let col_indices = [2, 1, 2]; // 列2を2回参照

        let result = rearrange_matrix(&matrix, &row_indices, &col_indices);
        let expected: Array2<i32> = arr2(&[[3, 2, 3], [3, 2, 3], [9, 8, 9]]);

        assert_eq!(result, expected);
    }
}