2015-02-13 3 views
3

Это звучит просто, но я не знаю, как это сделать.Как разбить массив numpy партиями?

я есть Numpy 2d массив

X = (1783,30) 

и я хочу, чтобы разделить их в партиях 64. Я пишу код, как это.

batches = abs(len(X)/BATCH_SIZE) + 1 // It gives 28 

Я пытаюсь сделать предсказание результатов в порядке. Поэтому я заполняю партию нулями и переписываю их с прогнозируемыми результатами.

predicted = [] 

for b in xrange(batches): 

data4D = np.zeros([BATCH_SIZE,1,96,96]) #create 4D array, first value is batch_size, last number of inputs 
data4DL = np.zeros([BATCH_SIZE,1,1,1]) # need to create 4D array as output, first value is batch_size, last number of outputs 
data4D[0:BATCH_SIZE,:] = X[b*BATCH_SIZE:b*BATCH_SIZE+BATCH_SIZE,:] # fill value of input xtrain 

#predict 
#print [(k, v[0].data.shape) for k, v in net.params.items()] 
net.set_input_arrays(data4D.astype(np.float32),data4DL.astype(np.float32)) 
pred = net.forward() 
print 'batch ', b 
predicted.append(pred['ip1']) 

print 'Total in Batches ', data4D.shape, batches 
print 'Final Output: ', predicted 

Но в последний номер партии 28, есть только 55 элементов вместо 64 (всего элементов 1783), и это дает

ValueError: could not broadcast input array from shape (55,1,96,96) into shape (64,1,96,96)

Что такое исправить это?

PS: для прогнозирования сети требуется точный размер партии - 64 для прогнозирования.

+0

Ваш вопрос непонятно мне (и учитывая количество просмотров и ответов, я не единственный). 1). Из какого модуля появляется 'net'? 2) У вас есть 2D-массив X. Вы хотите обрабатывать строки 0:64, затем 64: 2 * 64, затем 2 * 64: 3 * 64 и так далее. И вы знаете, что 1783 не кратно 64? В этом случае ошибка возникает в любом случае. Постарайтесь быть более ясными о том, что вы хотите, возможно, сводя себя к более простому примеру, например, 5x4. –

ответ

1

Я нашел ПРОСТОЙ способ решить проблему с партиями, создав манекен, а затем заполнив необходимые данные.

data = np.zeros(batches*BATCH_SIZE,1,96,96) 
// gives dummy 28*64,1,96,96 

Этот код будет загружать данные ровно 64 размера партии. Последняя партия будет иметь фиктивные нули в конце, но то хорошо :)

pred = [] 
for b in batches: 
data4D[0:BATCH_SIZE,:] = data[b*BATCH_SIZE:b*BATCH_SIZE+BATCH_SIZE,:] 
pred = net.predict(data4D) 
pred.append(pred) 

output = pred[:1783] // first 1783 slice 

Наконец я нарежьте из 1783 элементов из 28 * 64 всего. Это работало для меня, но я уверен, что существует много способов.

3

Я не совсем понимаю ваш вопрос, особенно, что X выглядит. Если вы хотите создать подгруппы одинакового размера вашего массива, попробуйте следующее:

def group_list(l, group_size): 
    """ 
    :param l:   list 
    :param group_size: size of each group 
    :return:   Yields successive group-sized lists from l. 
    """ 
    for i in xrange(0, len(l), group_size): 
     yield l[i:i+group_size] 
+0

Сеть может делать прогнозы только с данными из 64 партий. Так что ему нужны фиктивные данные, если размер партии равен 64 – pbu

0

data4D[0:BATCH_SIZE,:] должен быть data4D[b*BATCH_SIZE:b*BATCH_SIZE+BATCH_SIZE, :].

+0

Можете ли вы объяснить свой ответ, пожалуйста? – Zulu

+0

Это не будет работать, сеть будет принимать 4d-данные точно в пакетном размере 64. Если входной массив неравный, сетевая модель будет вызывать ошибку. – pbu

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