| 
1 | 1 | use self::interpolate::{higher_index, lower_index, Interpolate};  | 
2 |  | -use super::sort::get_many_from_sorted_mut_unchecked;  | 
3 | 2 | use crate::errors::QuantileError;  | 
4 | 3 | use crate::errors::{EmptyInput, MinMaxError, MinMaxError::UndefinedOrder};  | 
5 | 4 | use crate::{MaybeNan, MaybeNanExt};  | 
 | 5 | +use indexmap::IndexMap;  | 
6 | 6 | use ndarray::prelude::*;  | 
7 | 7 | use ndarray::{Data, DataMut, RemoveAxis, Zip};  | 
 | 8 | +use ndarray_slice::Slice1Ext;  | 
8 | 9 | use noisy_float::types::N64;  | 
9 | 10 | use std::cmp;  | 
10 | 11 | 
 
  | 
@@ -471,15 +472,20 @@ where  | 
471 | 472 |                     searched_indexes.push(higher_index(q, axis_len));  | 
472 | 473 |                 }  | 
473 | 474 |             }  | 
474 |  | -            searched_indexes.sort();  | 
475 |  | -            searched_indexes.dedup();  | 
 | 475 | +            let mut indexes = Array1::from_vec(searched_indexes);  | 
 | 476 | +            indexes.sort_unstable();  | 
 | 477 | +            let (indexes, _duplicates) = indexes.partition_dedup();  | 
476 | 478 | 
 
  | 
477 | 479 |             let mut results = Array::from_elem(results_shape, data.first().unwrap().clone());  | 
478 | 480 |             Zip::from(results.lanes_mut(axis))  | 
479 | 481 |                 .and(data.lanes_mut(axis))  | 
480 | 482 |                 .for_each(|mut results, mut data| {  | 
481 |  | -                    let index_map =  | 
482 |  | -                        get_many_from_sorted_mut_unchecked(&mut data, &searched_indexes);  | 
 | 483 | +                    let (lower_values, _higher) = data.select_many_nth_unstable(&indexes);  | 
 | 484 | +                    let index_map = indexes  | 
 | 485 | +                        .iter()  | 
 | 486 | +                        .copied()  | 
 | 487 | +                        .zip(lower_values.iter().map(|(_lower, value)| (*value).clone()))  | 
 | 488 | +                        .collect::<IndexMap<usize, A>>();  | 
483 | 489 |                     for (result, &q) in results.iter_mut().zip(qs) {  | 
484 | 490 |                         let lower = if I::needs_lower(q, axis_len) {  | 
485 | 491 |                             Some(index_map[&lower_index(q, axis_len)].clone())  | 
 | 
0 commit comments