2014-11-07 2 views
0
import numpy as np 

x = [1,2,3,4,5,6,7,8,9] 

y = [11,12,13,14,15,16,17,18,19] 

У меня есть список кортежей следующим образом:Произвольно выбрать кортежи из списка: тип ошибки

xy = [(x,y) for x,y in zip(x,y)] 

Теперь я хотел случайным образом выбрать 3 позиции/индекс кортежей в списке.

random_indices = np.random.choice(len(xy),3,replace=False) 

Здесь я применил индексы для возврата в список выбранных кортежей:

selected_xy = xy[random_indices] 
print selected_xy 

НО я получил следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "D:/test.py", line 11, in <module> 
    selected_xy = xy[random_indices] 
TypeError: only integer arrays with one element can be converted to an index 

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

[(1,11),(3,13),(4,14)] 

Каков наилучший способ сделать это?

ответ

3

Преобразовать xy в массив NumPy, списки поддерживают только индексацию с целыми числами:

>>> xy = np.array([(a, b) for a, b in zip(x, y)]) 
>>> random_indices = np.random.choice(len(xy), 3,replace=False) 
>>> xy[random_indices] 
array([[ 7, 17], 
     [ 2, 12], 
     [ 4, 14]]) 

В Python вы можете сделать это, используя либо operator.itemgetter или цикл по индексам в списке понимания и извлечения элемента по этому индексу:

>>> from operator import itemgetter 
>>> xy = [(a, b) for a, b in zip(x, y)] 
>>> random_indices = np.random.choice(len(xy), 3, replace=False) 
>>> itemgetter(*random_indices)(xy) 
((2, 12), (1, 11), (4, 14)) 
+0

спасибо, что это работает. так что numpy не использует список кортежей? – jean

+0

numpy лучше, так как я работаю с большим массивом в моем реальном случае. – jean

+0

@bercik NumPy преобразует эти кортежи в массивы для поддержки более быстрых операций. Вы можете сделать: 'map (tuple, xy [random_indices])', но это не стоит. –

Смежные вопросы