2015-04-08 1 views
6

У меня есть Numpy массив, который выглядит как:Как я могу сгладить массив 2d numpy, который имеет разную длину во второй оси?

myArray = np.array([[1,2],[3]]) 

Но я не могу придавить его,

In: myArray.flatten() 
Out: array([[1, 2], [3]], dtype=object) 

Если изменить массив той же длины во второй оси, то я могу сглаживаться Это.

In: myArray2 = np.array([[1,2],[3,4]]) 
In: myArray2.flatten() 
Out: array([1, 2, 3, 4]) 

Мой вопрос:

Могу ли я использовать некоторые вещи, как myArray.flatten() независимо размерность массива и длину его элементов, и получить выход: array([1,2,3])?

+2

NumPy не поддерживает оборванные массивы, и нет смысла использовать NumPy для массивов объектов (в этом случае списки), как у вас в этом вопросе. например '2 * myArray' предоставит вам' array ([[1, 2, 1, 2], [3, 3]], dtype = object) '. Возможно, вы захотите переосмыслить свою проблему или задать вопрос о том, что происходит на более ранней стадии вашего кода. – YXD

ответ

4

myArray является 1-мерным массивом объектов. Ваши объекты списка просто останутся в том же порядке с flatten() или ravel(). Вы можете использовать hstack складывать массивы в последовательности по горизонтали:

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

Следует отметить, что это в основном эквивалентно использованию concatenate с осью 1 (это должно иметь смысл интуитивно):

>>> np.concatenate(myArray, axis=1) 
array([1, 2, 3]) 

Если у вас не есть эта проблема, и может слить предметы, всегда желательно использовать flatten() или ravel() для исполнения:

In [1]: u = timeit.Timer('np.hstack(np.array([[1,2],[3,4]]))'\ 
    ....: , setup = 'import numpy as np') 
In [2]: print u.timeit() 
11.0124390125 

In [3]: u = timeit.Timer('np.array([[1,2],[3,4]]).flatten()'\ 
    ....: , setup = 'import numpy as np') 
In [4]: print u.timeit() 
3.05757689476 

Iluengo's answer также покрывали Вас для получения дополнительной информации о том, почему вы не можете использовать flatten() или ravel() учитывая ваш тип массива.

+0

Спасибо за ответ! Означает ли это, что могут делать flatten() или ravel(), также hstack() и concatenate(), которые являются более общими? – xirururu

+0

@xirururu См. Мой обновленный ответ. – miradulo

3

np.hstack работы в этом случае

In [69]: np.hstack(myArray) 
Out[69]: array([1, 2, 3]) 
8

Ну, я согласен с другими ответами, когда они говорят, что hstack или concatenate сделать работу в этом случае. Тем не менее, я хотел бы указать, что даже если он «исправляет» проблему, проблема не устранена должным образом.

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

>>> myArray.shape 
(2,) 
>>> myArray.dtype 
dtype('O') # stands for Object 
>>> myArray[0] 
[1, 2] 

Он показывает вам, что ваш массив не является 2D массив переменного размера (как вы могли бы подумать), это просто 1D массив объектов. В вашем случае эти элементы: list, являющийся первым элементом вашего массива, 2-элементным списком и вторым элементом массива является 1-элементный список.

Итак, flatten и ravel не будут работать, потому что преобразование 1D-массива в 1D-массив приводит к точному одному массиву 1D. Если у вас есть массив numbox object, он не заботится о том, что вы вкладываете внутрь, он будет обрабатывать отдельные элементы как неподтвержденные элементы и не может решить, как их объединить.

Что вы должны иметь в виду, это то, что вы хотите для своего приложения. Массивы с множественными числами особенно эффективны с числовыми матрицами фиксированного размера. Если вы играете с массивами объектов, я не понимаю, почему вы хотите использовать Numpy вместо обычных списков python.

+0

Я новичок в python, Numpy предоставляет множество полезных функций, поэтому мне не нужно писать длинные коды только для небольших вычислений, таких как +, -, sum ... :-) – xirururu

+4

@xirururu но, что я пытался что ваш массив не 2D. Если вы попробуете 'myArray + myArray', результатом будет' array ([[1, 2, 1, 2], [3, 3]], dtype = object) ', который, я уверен, не то, что вы ожидали. Чтобы использовать '+', '-' и' sum', вам нужно сделать свой массив числовым, и для этого он должен быть фиксированным. –

+0

Спасибо @iluengo. Я действительно никогда не ожидал этой проблемы ... :( – xirururu

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