2016-02-18 6 views
-2

«d» задано условие, однако оно было получено. Я хочу получить «результат» в требуемой форме. Я пробовал это следующим образом; но это выходит за рамки моего воображения.Обработка формы массивом numpy

import numpy as np 
data = [np.ones((300,1)), np.ones((300,5)), np.ones((300,3))] 

result = [] 
for d in data: 
    **print np.shape(np.array(d))** 
    result.append(d) 
print np.shape(np.array(result)) 

Результат должен быть в такой форме: (300, 1+5+3) = (300,9)

Может кто-нибудь мне помочь?

Я получил

ValueError: could not broadcast input array from shape (300,1) into shape (300)

EDIT: данные только, чтобы сделать этот вопрос; это просто представление моей большой программы. заданное условие - это d, который является списком, но различные формы - это список, генерируемый из цикла for.

+0

Что вы на самом деле получаете? –

+0

Также вы понимаете, что ваша петля только воссоздает исходный массив? –

+0

@MadPhysicist Я получил 'ValueError: не смог передать входной массив из формы (300,1) в форму (300)' – jean

ответ

2

3 2d массивы отличаются в последнем измерении могут быть соединены по этому измерению

Np.concatenate(data, axis=1) 

hstack делает то же самое.

В моем комментарии я предложил ось 0, но это был быстрый ответ, и я не испытал этого.

Когда вы пробуете идеи, и они терпят неудачу, покажите нам, что было не так. Вы указываете ValueError, но не показываете, где это произошло. Какая операция.

Ваши комментарии составлены из приблизительно d, но вы не видите, как d может отличаться от элементов data.

+0

В моей реальной проблеме d получен через длительную обработку, которая должна быть преобразована в результат. – jean

+0

Объяснение 'result' – hpaulj

+0

Я добавил' print np.shape (np.array (d)) ' – jean

1

Вы хотите укладывать элементы по горизонтали (если представить каждый элемент в виде матрицы с 300 строками и переменным числом столбцов), т.е.

import numpy as np 
data = [np.ones((300,1)), np.ones((300,5)), np.ones((300,3))] 
result = np.hstack(data) 

Если у вас есть доступ к итератору, который генерирует элементы только d вы можете достичь того же следующим образом:

result = np.hstack([d for d in some_iterator_that_generates_your_ds]) 
+0

Извините, данные не заданы; дается только 'd'. – jean

+0

@jean, Что это значит? У вас есть только один массив? Является ли 'data' генератором или чем-то еще? –

+0

В моей реальной проблеме d получается через длительную обработку, которая должна быть преобразована в результат. – jean

2

Ваш result является Python list. Фактически это list с таким же содержимым, как оригинал data. Вы пытаетесь объединить массивы по горизонтали (по второму измерению), так что вам нужно использовать numpy.hstack:

import numpy as np 
data = [] 
for d in some_source: 
    data.append(d) 
result = np.hstack(data) 
print result.shape 

Если some_source список, генератор, или любой другой итератор, вы можете сделать это еще более лаконично:

result = np.hstack(some_source) 
+0

К сожалению, данные не указаны; дается только d. Я написал «данные» как пример. – jean

+0

@jean, Что это значит? У вас есть только один массив? –

+0

В моей реальной проблеме 'd' получается через длинную обработку, которая должна быть преобразована в' result'. – jean

2

Вы также можете попробовать numpy.column_stack, который по существу numpy.concatenate под капотом.

Пример использования

In [1]: import numpy as np 

In [2]: data = [np.ones((300,1)), np.ones((300,5)), np.ones((300,3))] 

In [3]: out = np.column_stack(data) 

In [4]: out.shape 
Out[4]: (300, 9) 
+0

В моей реальной задаче d получается через длинную обработку, которая должна быть преобразована в результат. – jean

+1

Это не имеет никакого смысла. Является ли ваш результат списком массивов 'numpy' или что? – rayryeng

+0

@jean Хорошо, вы говорите, что у вас, возможно, есть бесконечный цикл, и 'd' постоянно получается? – rayryeng

0

попробовать:

import numpy as np 
data = [np.ones((300,1)), np.ones((300,5)), np.ones((300,3))] 

result = [] 
print(len(data)) 
for d in data: 
    result.append(np.hstack(d)) 

print(result.shape) 

Это должно сделать работу. Вы также можете попробовать:

import numpy as np 
data = np.ones((300,1)), np.ones((300,5)), np.ones((300,3)) 

result = np.vstack(data[-1]) 

print(result.shape) 

Оба из которых даст (300, 3) как выход.

Если вы ищете (300, 9), вы можете сделать следующее:

result = np.hstack(data) 

Наконец, если вы хотите, чтобы Ваши результаты будут в list() в отличие от numpy.array или numpy.matrix, вы можете просто воткнуть .tolist() до конца, вот так: result.tolist().