如何在切片上执行计算后创建新的ndarray

问题描述 投票:0回答:1

我有一个4d numpy数组,我想在它的几个切片上执行计算,然后创建一个包含所有值的新数组。主要问题是我有3个维度的固定切片但是第四个轴的几个范围如何请按第4轴的范围切片

python slice numpy-ndarray inequalities
1个回答
1
投票

虽然我认为这里已经有几个类似的问题(numpy 4d slice的38个结果),这是我尝试在视觉上解释这一点。首先,我从Giphy下载了一个.gif并将其转换为典型的多维np.array();它的尺寸为200x200px,有3个颜色通道,6个框架,形状为(6, 200, 200, 3)

enter image description here

在图的第一行中,我分别显示每个颜色通道,以及带有索引1的帧的总和(请注意,这里忽略了cmap关键字)。

接下来,我创建了绿色通道的特定切片(颜色指数1),其在y方向上为50-150px,在x方向上为100-120px,如下所示: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()
© www.soinside.com 2019 - 2024. All rights reserved.