numba嵌套列表中的唯一列表

问题描述

我想在nopython numba函数的嵌套列表中找到唯一列表的数量,例如:

from collections import Counter

def number_of_unique_lists_v1(a):
    uniques = Counter(tuple(item) for item in a)
    number = len(uniques.keys())
    return number

print(number_of_unique_lists_v1([[1,2,3],[1,2],[3,4],3])
>>> 3

def number_of_unique_lists_v2(a):
    uniques = [list(x) for x in set(tuple(x) for x in a)]
    number = len(uniques)
    return number

print(number_of_unique_lists_v2([[1,3])
>>> 3

不幸的是,这两种想法都不适用于@ nb.njit。我该如何运作?

编辑

使用mpw2的方法,我发现原则上以下代码有效:

from numba.typed import List
@nb.njit
def number_of_unique_lists_v3():
    a = [[1,3]]
    s = List()
    for x in a:
        if not x in s:
            s.append(x)
    number = len(s)
    return number


print(number_of_unique_lists())
>>> 3

但这对我不起作用,因为列表a在我的函数中创建时稍有不同,类似于下面的最小示例所示。

from numba.typed import List
@nb.njit
def number_of_unique_lists():
    a = [[0] for _ in range(4)]
    a[0] = [1,3]
    a[1] = [1,2]
    a[2] = [3,4]
    a[3] = [1,3]
    s = List()
    for x in a:
        if not x in s:
            s.append(x)
    number = len(s)
    return number

现在我收到一个我不明白的错误...

解决方法

这是使用numba.typed.List()对象的一种可行解决方案

irb(main):001:0> require 'csv'
=> false
irb(main):002:0> csv="name,value\n\r\nid,1"
irb(main):003:0> CSV::parse(csv)
Traceback (most recent call last):
       16: from /usr/local/bin/irb:23:in `<top (required)>'
       15: from /usr/local/bin/irb:23:in `load'
       14: from /usr/local/lib/ruby/gems/2.7.0/gems/irb-1.2.3/exe/irb:11:in `<top (required)>'
       13: from (irb):3
       12: from /usr/local/lib/ruby/2.7.0/csv.rb:686:in `parse'
       11: from /usr/local/lib/ruby/2.7.0/csv.rb:1289:in `read'
       10: from /usr/local/lib/ruby/2.7.0/csv.rb:1289:in `to_a'
        9: from /usr/local/lib/ruby/2.7.0/csv.rb:1280:in `each'
        8: from /usr/local/lib/ruby/2.7.0/csv.rb:1280:in `each'
        7: from /usr/local/lib/ruby/2.7.0/csv/parser.rb:336:in `parse'
        6: from /usr/local/lib/ruby/2.7.0/csv/parser.rb:823:in `parse_quotable_loose'
        5: from /usr/local/lib/ruby/2.7.0/csv/parser.rb:49:in `each_line'
        4: from /usr/local/lib/ruby/2.7.0/csv/parser.rb:49:in `each_line'
        3: from /usr/local/lib/ruby/2.7.0/csv/parser.rb:52:in `block in each_line'
        2: from /usr/local/lib/ruby/2.7.0/csv/parser.rb:842:in `block in parse_quotable_loose'
        1: from /usr/local/lib/ruby/2.7.0/csv/parser.rb:928:in `parse_quotable_robust'
CSV::MalformedCSVError (New line must be <"\n"> not <"\r"> in line 2.)
irb(main):004:0> CSV::parse(csv.gsub(/\r\n/,"\n"))
=> [["name","value"],[],["id","1"]]