|
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