2016-08-15 3 views
0

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

out.shape = (20,) 
reference.shape = (20,0) 
norm = [out[i]/np.sum(out[i]) for i in range(len(out))] 
# norm is a list now so I convert it to ndarray: 
norm_array = np.array((norm)) 
norm_array.shape = (20,30) 

# error: operands could not be broadcast together with shapes (20,30) (20,) 
diff = np.fabs(norm_array - reference) 

Как я могу изменить форму norm_array из (20,30) в (20) или ссылки (20,30), поэтому я могу их вычесть?

EDIT: Может кто-нибудь объяснить мне, почему они имеют другую форму, если я могу получить доступ к обоим элементам с помощью norm_array [0] [0] и ссылки [0] [0]?

ответ

2

Я не уверен, что вы пытаетесь сделать точно, но вот некоторая информация о массивах numpy.

А 1-д NumPy массив является вектором-строки с формой, которая является однозначным кортежем:

>>> np.array([1,2,3]).shape 
(3,) 

Вы можете создать многомерные массивы путем передачи вложенных списков. Каждый под-список является 1-строчным вектором строки длиной 1, и их 3.

>>> np.array([[1],[2],[3]]).shape 
(3,1) 

Это странная деталь. Вы можете создать тот же массив, но оставить списки пустыми. Вы в конечном итоге с 3-мя рядами векторов длины 0.

>>> np.array([[],[],[]]).shape 
(3,0) 

Это то, что у вас есть для вас reference массив, массив со структурой, но без каких-либо значений. Это возвращает меня к исходному моменту:

Вы не можете вычесть пустой массив.

+0

Добавление к этому: вы должны прочитать о правилах вещания. Если последнее измерение из 2 массивов отличается, один из них должен быть «1», чтобы иметь возможность транслировать. В вашем случае ваши последние измерения - '0' и' 30', поэтому трансляция невозможна, поэтому сообщение об ошибке. Вы, вероятно, хотите 'reference.shape = (20,1)' ... – Julien

+0

, не говоря уже о том, что понимание списка просто выводит '1' (и nans). –

0

Если я 2 массивов с формами вы описываете, я получаю сообщение об ошибке

In [1856]: norm_array=np.ones((20,30)) 
In [1857]: reference=np.ones((20,0)) 
In [1858]: norm_array-reference 
... 
ValueError: operands could not be broadcast together with shapes (20,30) (20,0) 

Но это отличается от вашего. Но если я изменяю форму reference, сообщения об ошибках совпадают.

In [1859]: reference=np.ones((20,)) 
In [1860]: norm_array-reference 
... 
ValueError: operands could not be broadcast together with shapes (20,30) (20,) 

Так что ваш (20,0) неправ. Я не знаю, что вы что-то угадали или нет.

Но если я reference 2d с 1 в последнем измерении, передающую работы, производя различие, которое соответствует (20,30) в форме:

In [1861]: reference=np.ones((20,1)) 
In [1862]: norm_array-reference 

If reference = np.zeros((20,)), то я мог бы использовать, чтобы добавить reference[:,None] это одномерное измерение.

Если reference есть (20,), вы не можете сделать reference[0][0]. reference[0][0] работает только с 2d массивами, по крайней мере, с 1 в последнем тусклом. reference[0,0] - предпочтительный способ индексирования одного элемента массива 2d.

До сих пор это нормальные размеры и широковещание массива; то, чему вы научитесь с пользой.

===============

Я озадачен о форме out. Если это (20,), то как norm_array заканчивается как (20,30). out должен состоять из 20 массивов или списков, каждый из которых имеет 30 элементов.

Если out был 2d массив, можно нормализовать без итерации

In [1869]: out=np.arange(12).reshape(3,4) 

со списком понимания:

In [1872]: [out[i]/np.sum(out[i]) for i in range(out.shape[0])] 
Out[1872]: 
[array([ 0.  , 0.16666667, 0.33333333, 0.5  ]), 
array([ 0.18181818, 0.22727273, 0.27272727, 0.31818182]), 
array([ 0.21052632, 0.23684211, 0.26315789, 0.28947368])] 
In [1873]: np.array(_) # and to array 
Out[1873]: 
array([[ 0.  , 0.16666667, 0.33333333, 0.5  ], 
     [ 0.18181818, 0.22727273, 0.27272727, 0.31818182], 
     [ 0.21052632, 0.23684211, 0.26315789, 0.28947368]]) 

Вместо взять строки суммы, и сказать ему, чтобы держать его 2d для облегчения дальнейшего использование

In [1876]: out.sum(axis=1,keepdims=True) 
Out[1876]: 
array([[ 6], 
     [22], 
     [38]]) 

сейчас разделите

In [1877]: out/out.sum(axis=1,keepdims=True) 
Out[1877]: 
array([[ 0.  , 0.16666667, 0.33333333, 0.5  ], 
     [ 0.18181818, 0.22727273, 0.27272727, 0.31818182], 
     [ 0.21052632, 0.23684211, 0.26315789, 0.28947368]]) 
Смежные вопросы