2014-04-23 2 views
2
import numpy as np 
data= np.array([[0,1,2,3,4,7,6,7,8,9,10], 
     [10,3,10,4,7,7,7,8,11,12,11], 
     [10,10,3,5,7,7,7,9,11,11,11], 
     [3,4,3,6,7,7,7,10,11,11,11], 
     [4,5,6,7,7,9,10,11,11,11,11]], dtype='float') 

my_groups = ['Group_A', 'Group_B', 'Group_C'] 
my_values = [7, 10, 11] 
my_data ={} 
for x, y in zip(my_groups, my_values): 
    my_data[x] = np.where(data==y) 
print my_data 

#{'Group_C': (array([1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4], dtype=int64), array([ 8, 10, 8, 9, 10, 8, 9, 10, 7, 8, 9, 10], dtype=int64)), 'Group_B': (array([0, 1, 1, 2, 2, 3, 4], dtype=int64), array([10, 0, 2, 0, 1, 7, 6], dtype=int64)), 'Group_A': (array([0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4], dtype=int64), array([5, 7, 4, 5, 6, 4, 5, 6, 4, 5, 6, 3, 4], dtype=int64))} 

Теперь я хочу, чтобы случайно выбрать три позиции индекса для каждой группы и поместить их в словарной форме:случайным образом выбирать данные из формы словаря

samples = {} 
for x,y in zip(my_groups,my_data): 
    for i in np.random.choice(len(my_data), 3, replace=True): 
     samples[x] = np.array(my_data[x][i], dtype=np.int64) 

print samples 

В поисках хороших идей. Я не мог заставить образцы работать.

EDIT: Это для проверки непротиворечивости:

import numpy as np 
data= np.array([[0,1,2,3,4,7,6,7,8,9,10], 
     [10,3,10,4,7,7,7,8,300,12,11], 
     [300,10,100,5,7,7,7,9,200,11,11], 
     [3,4,3,6,7,200,7,100,11,11,11], 
     [4,5,6,7,7,9,10,11,11,11,11]], dtype='float') 

my_groups = ['Group_A', 'Group_B', 'Group_C'] 
my_values = [100, 200, 300] 
my_data ={} 
for x,y in zip(my_groups, my_values): 
    my_data[x] = np.where(data==y) 
print my_data 

samples = {} 
for x,y in my_data.iteritems(): 
    idx_choice = np.random.choice(len(y[0]),2, replace=False) 
    samples[x] = (y[0][idx_choice],y[1][idx_choice]) 
print samples 

samples = {} 
for x, y in my_data.iteritems(): 
    samples[x] = [(y[0][i],y[1][i]) for i in np.random.choice(len(y[0]),2,replace=False)] 
print samples 
+0

и вопрос? – Acorbe

+0

Я не мог заставить образцы работать. –

ответ

2

Если я правильно понял, вы хотите, чтобы случайным образом выбрать три пары индексов (как возвращаемый np.where) для каждой группы, которую вы определили.

Это можно сделать легко, например. через понимание списка.

Рассмотрим этот

samples = {} 
for x,y in my_data.iteritems(): 
    samples[x] = [(y[0][i],y[1][i]) for i in np.random.choice(len(y[0]),3)] 

OUTPUT

samples 
{'Group_A': [(2, 5), (3, 6), (1, 6)], 
    'Group_B': [(3, 7), (3, 7), (2, 0)], 
    'Group_C': [(2, 10), (2, 8), (2, 10)]} 

EDIT: В качестве альтернативы, вы можете выход ближе к тому, что возвращаемый np.where. В этом случае вы можете сделать

samples = {} 
for x,y in my_data.iteritems(): 
    idx_choice = np.random.choice(len(y[0]),3) 
    samples[x] = (y[0][idx_choice],y[1][idx_choice]) 

который дает

samples 
{'Group_A': (array([0, 3, 3]), array([7, 4, 5])), 
'Group_B': (array([1, 1, 2]), array([2, 2, 1])), 
'Group_C': (array([2, 3, 2]), array([9, 8, 9]))} 
+0

спасибо за ваш ответ. я бы предпочел получить значения индекса таким образом, чтобы он возвращался функцией np.where –

+0

@neha, для этого был изменен ответ. – Acorbe

+0

Полученные позиции в случае образцов не согласуются с позициями исходных данных –

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