2015-12-31 2 views
1

В настоящее время у меня есть список кортежей, который выглядит следующим образом:Python: превратить кортежи в массив

[(0, 0.13), (323, 0.72), (812, 0.35), ..., (2127, 0.44)] 

Кортежи упорядочены по их первому элементу: 0 -> 323 -> 812 -> ...

Я хочу, чтобы превратить этот список кортежей в массив (или разреженной Matrx), с первым элементом каждого кортежа являющегося индексом массива второго элемента:

[0.13, 0, ..., 0, 0.72, 0, ..., 0, 0.35, 0, ...] 

И заполнить конец этого массив с 0s, чтобы распространить его на ce длина полосы.

Может ли кто-нибудь обеспечить быструю реализацию функции выше в python?

В настоящее время я использую словарь для выполнения этой процедуры, и он очень медленный для больших массивов.

спасибо.

+0

Если я правильно понял, вы хотите создать массив с 0 в качестве заполнителей для тех индексов, которые отсутствуют; поэтому между 0,13 и 0,72 имеется 322 нулей - это правильно? –

+0

Да! Извините за мое плохое написание абзаца. – yi416

ответ

1

Вы можете предварительно выделить массив нулей и затем заполнить поставленные номера:

def expand_sparse_array(inp): 
    length = (inp[-1][0]+1) # index of last element + 1 
    out = [0]*length 

    for (idx, val) in inp: 
     out[idx] = val 

    return out 

Например:

>>> expand_sparse_array([(0, 0.13), (3, 0.72), (5, 0.35), (10, 0.44)]) 
[0.13, 0, 0, 0.72, 0, 0.35, 0, 0, 0, 0, 0.44] 
0

Я думаю, что это будет делать то, что вам требуется:

results = [] 
for k,i in list_of_tuples: 
    while k > len(results): 
    results.append(0) 
    results.append(i) 

Вот пример работы, учитывая ввод [(0, 12), (5, 43), (10, 1)], есть результат есть:

>>> i = [] 
>>> for k,v in t: 
... while k > len(i): 
...  i.append(0) 
... i.append(v) 
... 
>>> i 
[12, 0, 0, 0, 0, 43, 0, 0, 0, 0, 1] 
Смежные вопросы