|
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