Почему np.concatenate меняет размерность - PullRequest
0 голосов
/ 08 сентября 2018

В следующей программе я пытаюсь понять, как работает команда np.concatenate. После доступа к каждой строке массива по циклу for, когда я объединяюсь вдоль оси строк, я ожидаю двухмерный массив, имеющий форму (5,5), но он меняется.

Я хочу иметь такое же измерение (5,5) после объединения. Как я могу это сделать?

Я попытался повторить описанный выше метод для двумерного массива, сохранив их в списке [(2,5),(2,5),(2,5)]. В конце, когда я объединяю, это дает мне форму (6,5), как и ожидалось, но в следующем случае она отличается.

a = np.arange(25).reshape(5,5)


ind =[0,1,2,3,4]
list=[]
for i in ind:
    list.append(a[i])

new= np.concatenate(list, axis=0)
print(list)
print(len(list))
print(new)
print(new.shape)

Это дает следующие результаты для new:

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]

и для new.shape:

(25,)

1 Ответ

0 голосов
/ 08 сентября 2018

Для предисловия вам не следует использовать concatenate здесь.

Настройка

a = np.arange(25).reshape(5,5)
L = [i for i in a]

Вы задаете вопрос:

Почему np.concatenate меняет размер?

Это не изменение измерения, оно делает именно то, что должно, основываясь на вводе, который вы ему даете. Из документации :

Объединить последовательность массивов вдоль существующей оси

Когда вы передаете свой список в concatenate, не думайте, что он пропускает список (5, 5), думайте о нем, как о пропуске 5 (5,) массивов фигур, которые соединяются вдоль оси 0, что будет интуитивно производить вывод формы (25,).

Теперь это поведение также дает представление о том, как обойти это. Если пропуск массивов формы 5 (5,) приводит к выводу формы (25,), нам просто нужно пропустить массив (1, 5), чтобы получить вывод формы (5, 5). Мы можем сделать это, просто добавив измерение к каждому элементу L:

np.concatenate([[i] for i in L])

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

Однако , намного Лучший способ подойти к этому - просто использовать stack, vstack и т. Д.

>>> np.stack(L)
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

>>> np.vstack(L)    
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...