Как я могу изменить форму этого массива?

Вопрос или проблема

У меня есть некоторые трудности с выбором значений из массива. Вот упрощенная версия проблемной части кода. (Если вы хотите добавить весь код, пожалуйста, укажите это)

n=2
m=8
test= test[:,-n*m:] 
test=test.reshape(test.shape[0],n,m)

В итоге я получаю:

test.shape= (350, 2, 8)

когда я запускаю код, я получаю это:

array([[[0.01911469, 0.32352942, 0.18032786, ..., 0.006101  ,
         0.        , 0.        ],
        [0.01810865, 0.32352942, 0.18032786, ..., 0.006101  ,
         0.        , 0.        ]],

       [[0.01810865, 0.32352942, 0.18032786, ..., 0.006101  ,
         0.        , 0.        ],
        [0.01710262, 0.32352942, 0.1967213 , ..., 0.01297103,
         0.        , 0.        ]],

       [[0.01710262, 0.32352942, 0.1967213 , ..., 0.01297103,
         0.        , 0.        ],
        [0.01408451, 0.32352942, 0.18032786, ..., 0.00763907,
         0.        , 0.        ]],

       ...,

       [[0.01006036, 0.2647059 , 0.26229507, ..., 0.40558836,
         0.        , 0.        ],
        [0.01006036, 0.2647059 , 0.26229507, ..., 0.41399646,
         0.        , 0.        ]],

       [[0.01006036, 0.2647059 , 0.26229507, ..., 0.41399646,
         0.        , 0.        ],
        [0.00804829, 0.2647059 , 0.24590163, ..., 0.4208665 ,
         0.        , 0.        ]],

       [[0.00804829, 0.2647059 , 0.24590163, ..., 0.4208665 ,
         0.        , 0.        ],
        [0.01207243, 0.2794118 , 0.26229507, ..., 0.42621556,
         0.        , 0.        ]]], dtype=float32)

Мой вопрос: как я могу получить только значения из первых столбцов вот так:

array([[0.01911469],
       [0.01810865],
       [0.01810865],
       [0.01710262],
       [0.01710262],
       [0.01408451],
        ...,
       [0.01006036],
       [0.01006036], 
       [0.01006036],
       [0.00804829],
       [0.00804829],
       [0.01207243]], dtype=float32)

Я попробовал это:

test=test[:,:,:1]

но я получил это вместо того, что искал:

array([[[0.01911469],
        [0.01810865]],

       [[0.01810865],
        [0.01710262]],

       [[0.01710262],
        [0.01408451]],

       ...,

       [[0.01006036],
        [0.01006036]],

       [[0.01006036],
        [0.00804829]],

       [[0.00804829],
        [0.01207243]]], dtype=float32)

Попробуйте следующий код. Так как вы хотите все первые значения нулевого измерения.

test=test[:,0,0]

Ответ или решение

Вопрос, как преобразовать массив, может быть довольно сложным, особенно если важно сохранить определенную структуру данных или извлечь конкретные значения. В данном случаем мы работаем с трехмерным массивом и требуется извлечь данные из первой колонки каждой из плоскостей массивов. Для начала разберемся, как используется индексирование в библиотеках работы с массивами, таких как NumPy.

Теория

NumPy — это популярная библиотека для работы с многомерными массивами и матрицами в Python. В ней активно используются понятия "оси" и "индексирование", что позволяет легко манипулировать данными.

  • Ось (axis): В NumPy, ось — это способ обращения к определенному измерению массива. Например, в трехмерном массиве ось 0 касается первого измерения, ось 1 — второго, и ось 2 — третьего.
  • Индексация: Это процесс извлечения конкретного элемента из массива с использованием его индекса. Индексы начинаются с нуля, так что для извлечения первого элемента массиве используется индекс 0.

Когда мы имеем дело с трехмерным массивом формы (350, 2, 8):

  • Ось 0 представляет 350 "плоскостей".
  • Ось 1 представляет два элемента в каждой "плоскости".
  • Ось 2 имеет восемь элементов в каждой группе.

Пример

На основе вашего кода из вопроса, чтобы извлечь значения из первой колонки каждой из плоскостей, используется следующее выражение: test[:, 0, 0].

  • : — означает, что мы выбираем все элементы по этой оси (в данном случае, по оси 0, то есть все 350 плоскостей)
  • 0 в позиции оси 1 — это выбор первого элемента в каждой из плоскостей.
  • 0 в позиции оси 2 — выбираем первый элемент внутри первой строки каждой из плоскостей.

Применение

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

  1. Индексация по первой оси (:): Мы выбираем все плоскости и просто хотим скопировать их.
  2. Индексация по второй оси (0): Мы хотим выбрать из каждой плоскости только первую строку.
  3. Индексация по третьей оси (0): Мы стремимся выбрать из каждой строки только первый элемент.

Таким образом, выражение test[:, 0, 0] вам предоставит одномерный массив, который вы искали. Этот массив будет содержать 350 элементов из первой колонки каждой плоскости массива test.

Заключение

Работа с многомерными массивами и их преобразование — задача, связанная с тщательным управлением осами и индексами. Индексация — это мощный инструмент для извлечения нужной информации и может быть использована для выполнения сложных операций преобразования. Важно хорошо понимать структуру исходных данных, чтобы корректно применять нужные операции. Ваша конкретная задача — работа с трехмерным массивом — требует извлечения элементов, что было достигнуто через правильное использование индексации.

Если у вас возникнут дополнительные вопросы или сложности с манипуляцией данными в NumPy, не стесняйтесь обращаться за дополнительной информацией. NumPy — это обширная и гибкая библиотека, которая предоставляет огромные возможности для анализа данных и инженерных задач.

Оцените материал
Добавить комментарий

Капча загружается...