Правильный и эффективный способ сглаживания массива в numpy в python? - программирование
Подтвердить что ты не робот

Правильный и эффективный способ сглаживания массива в numpy в python?

У меня есть:

a = array([[1,2,3],[4,5,6]])

и я хотел бы сгладить его, объединив два внутренних списка в одну запись с плоским массивом. Я могу сделать:

array(list(flatten(a)))

но это кажется неэффективным из-за списка (я хочу получить массив, а не генератор).

Кроме того, как это можно обобщить на такой массив:

b = array([[[1,2,3],[4,5,6]], [[10,11,12],[13,14,15]]])

где результат должен быть:

b = array([[1,2,3,4,5,6],
           [10,11,12,13,14,15]])

Есть ли встроенные/эффективные операторы numpy/scipy для этого? спасибо.

4b9b3361

Ответ 1

Вы можете использовать метод reshape.

>>> import numpy
>>> b = numpy.array([[[1,2,3],[4,5,6]], [[10,11,12],[13,14,15]]])
>>> b.reshape([2, 6])
array([[ 1,  2,  3,  4,  5,  6],
       [10, 11, 12, 13, 14, 15]])

Ответ 2

Вам может потребоваться проверить numpy.flatten и numpy.ravel, оба возвращают 1-й массив из массива n-d.

Кроме того, если вы не собираетесь изменять возвращенный массив 1-d, я предлагаю вам использовать numpy.ravel, так как он не делает копию массива, а просто возвращает представление массива, которое намного быстрее, чем numpy.flatten.

>>>a = np.arange(10000).reshape((100,100))

>>>%timeit a.flatten()
100000 loops, best of 3: 4.02 µs per loop

>>>%timeit a.ravel()
1000000 loops, best of 3: 412 ns per loop

Также проверьте этот post.

Ответ 3

Как насчет:

>>> import numpy as np
>>> a=np.arange(1,7).reshape((2,3))
>>> a
array([[1, 2, 3],
       [4, 5, 6]])
>>> a.flatten()
array([1, 2, 3, 4, 5, 6])

и

>>> import numpy as np
>>> b=np.arange(1,13).reshape((2,2,3))
>>> b
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])
>>> b.reshape((2,6))
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12]])

Ответ 4

a = np.arange(10000)

%timeit a.reshape(100,100)
1000000 loops, best of 3: 517 ns per loop

%timeit a.resize(100,100)
1000000 loops, best of 3: 428 ns per loop

Мне кажется, что изменение должно занимать гораздо меньше времени, но его почти похожее