Как создать новый ndarray после выполнения расчета на срез - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть массив 4d numpy, я хочу выполнить вычисления для нескольких его фрагментов, а затем создать новый массив со всеми значениями. Основная проблема заключается в том, что у меня есть фиксированные фрагменты для 3 измерений, но затем несколько диапазонов дляЧетвертая ось Как мне нарезать по диапазонам на 4-й оси, пожалуйста

1 Ответ

1 голос
/ 15 апреля 2019

Хотя я думаю, что здесь уже есть несколько похожих вопросов (38 результатов для numpy 4d slice), вот моя попытка визуально объяснить это. Сначала я скачал .gif с Giphy и преобразовал его в пример многомерного np.array(); он имеет размер 200x200px, имеет 3 цветовых канала и 6 кадров, что дает форму (6, 200, 200, 3).

enter image description here

В первой строке графика я показываю каждый цветной канал отдельно и общую сумму кадра с индексом 1 (обратите внимание, что ключевое слово cmap здесь не учитывается).

Затем я создаю определенный срез зеленого канала (индекс цвета 1), который идет от 50-150px в направлении y и 100-120px в направлении x следующим образом: my_slice= frames[frame_index,50:150,100:120,1] - он имеет форма (100, 20). Я умножаю его на 0,1 и вставляю результат в исходное положение.

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

Если вы сейчас хотите выполнить это действие, например, кадры [0,4,5], это становится простой петлей for frame_index in [0,4,5]:. Надеюсь, это поможет.

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image, ImageSequence

## downloaded from here: 
# https://media.giphy.com/media/uQCxA7u9CEdIA/200w_d.gif
img = Image.open("/path/to/Downloads/brainscan.gif")
frames = np.array([np.array(frame.copy().convert('RGB').getdata(),dtype=np.uint8).reshape(frame.size[1],frame.size[0],3) for frame in ImageSequence.Iterator(img)])

print(np.shape(frames))

frame_index=1

fig,axes=plt.subplots(2,4,figsize=(10,4))
axes[0,0].imshow(frames[frame_index,:,:,0],cmap="Reds_r")
axes[0,1].imshow(frames[frame_index,:,:,1],cmap="Greens_r")
axes[0,2].imshow(frames[frame_index,:,:,2],cmap="Blues_r")
axes[0,3].imshow(frames[frame_index,:,:,:],cmap="viridis")

my_slice= frames[frame_index,50:150,100:120,1]
print(np.shape(my_slice[:]))
frames[frame_index,50:150,100:120,1]=0.1*my_slice

axes[1,0].imshow(frames[frame_index,:,:,0],cmap="Reds_r")
axes[1,1].imshow(frames[frame_index,:,:,1],cmap="Greens_r")
axes[1,2].imshow(frames[frame_index,:,:,2],cmap="Blues_r")
axes[1,3].imshow(frames[frame_index,:,:,:],cmap="viridis")


plt.show()
...