【问题标题】:Rust Unique Return Counts / Unique with FrequencyRust 唯一返回计数/频率唯一
【发布时间】:2023-01-08 05:07:52
【问题描述】:

获取向量中的唯一元素及其计数的最快方法是什么?类似于numpy.unique(return_counts=True)。随着数组增长到数百万,下面变得非常慢。

use std::collections::HashMap;
use itertools::Itertools;

fn main () {
    let kmers: Vec<u8> = vec![64, 64, 64, 65, 65, 65];
    let nodes: HashMap<u8, usize> = kmers
        .iter()
        .unique()
        .map(|kmer| {
            let count = kmers.iter().filter(|x| x == &kmer).count();
            (kmer.to_owned(), count)
        })
        .collect();
    println!("{:?}", nodes)   
}

【问题讨论】:

    标签: rust


    【解决方案1】:

    您可以为此使用entry API。链接的文档有一个与您需要的示例类似的示例,此处对其进行了修改以适合您的情况:

    use std::collections::HashMap;
    
    fn main () {
        let kmers: Vec<u8> = vec![64, 64, 64, 65, 65, 65];
        let mut nodes: HashMap<u8, usize> = HashMap::new();
        for n in kmers.iter() {
            nodes.entry(*n).and_modify(|count| *count += 1).or_insert(1);
        }
    
        println!("{:?}", nodes)   
    }
    

    playground

    如果要对输出进行排序,可以改用 BTreeMap

    【讨论】:

      【解决方案2】:

      如果您更喜欢单线,您可以使用 itertools 的counts():(这使用与@PitaJ 答案相同的代码,但有一点改进):

      use std::collections::HashMap;
      
      use itertools::Itertools;
      
      fn main () {
          let kmers: Vec<u8> = vec![64, 64, 64, 65, 65, 65];
          let nodes: HashMap<u8, usize> = kmers.iter().copied().counts();
          println!("{:?}", nodes)   
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-04
        • 1970-01-01
        • 2020-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多