Как изменить массив Numpy с (x, y, z) на (y, z, x) - PullRequest
0 голосов
/ 05 октября 2018

У меня есть массив измерений (3 120 100), и я хочу преобразовать его в массив измерений (120 100 300).У меня есть массив

arr1 = np.ones((120,100), dtype = int)
arr2 = arr1*2
arr3 = arr1*3
arr = np.stack((arr1,arr2,arr3))
arr

. Он содержит три массива 120x100 из 1, 2 и 3.Когда я использую Reshape для него, я получаю 120x100 массивов из 1, 2 или 3.

Я хочу получить массив 120x100, где каждый элемент [1,2,3]

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Если вы хотите большой массив, содержащий 1, 2 и 3, как вы описываете, user3483203 ответ будет рекомендуемым вариантом.Если у вас, как правило, есть массив с формой (X, Y, Z), и вы хотите, чтобы он был (Y, Z, X), вы обычно используете np.transpose:

import numpy as np

arr = ... # Array with shape (3, 120, 100)
arr_reshaped = np.transpose(arr, (1, 2, 0))
print(arr_reshaped.shape)
# (120, 100, 3)

РЕДАКТИРОВАТЬ:В заголовке вопроса говорится, что вы хотите изменить форму массива с (X, Y, Z) до (Z, Y, X), но, похоже, в тексте предлагается изменить форму с (X, Y, Z) на (Y, Z, X).Я следовал за текстом, но для названия в заголовке это было бы просто np.transpose(arr, (2, 1, 0)).

0 голосов
/ 05 октября 2018

Я отвечу на это, предполагая, что это является частью более крупной проблемы, и это просто пример данных, демонстрирующих, что вы хотите сделать.В противном случае решение для вещания работает просто отлично.

Когда вы используете reshape, это не меняет того, как numpy интерпретирует порядок отдельных элементов.Это просто влияет на как numpy смотрит на форму.Таким образом, если у вас есть элементы a, b, c, d в массиве на диске, которые можно интерпретировать как массив shape (4,), shape (2, 2) или shape (1, 4) и так далее.

То, что вы ищете, это transpose.Это влияет на то, как поменяется местами интерпретация осей.В вашем случае

>>>arr.transpose(2,1,0)
array([[[1, 2, 3],
    [1, 2, 3],
    [1, 2, 3],
    ..., 
    [1, 2, 3],
    [1, 2, 3],
    [1, 2, 3]]])
0 голосов
/ 05 октября 2018

Вам не нужно создавать очень большой массив и изменять его форму.Поскольку вы знаете, каким должен быть каждый элемент и какую форму вы хотите получить, вы можете просто использовать numpy.broadcast_to.Это требует настройки просто создания массива фигур (3,).

Настройка

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

np.broadcast_to(arr, (120, 100, 3))

array([[[1, 2, 3],
        [1, 2, 3],
        [1, 2, 3],
        ...,
        [1, 2, 3],
        [1, 2, 3],
        [1, 2, 3]],

       [[1, 2, 3],
        [1, 2, 3],
        [1, 2, 3],
        ...,
        [1, 2, 3],
        [1, 2, 3],
        [1, 2, 3]]])

Чтобы получить версию этого вывода, не предназначенную только для чтения, вы можете позвонить copy():

out = np.broadcast_to(arr, (120, 100, 3)).copy()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...