似乎无法想出这一个。非常新的numpy。
我有一个形状(200,1,1000,1000)
的numpy数组,对应于(图像数,通道数,x_of_image,y_of_image)。所以我有200个图像,1个通道,每个1000x1000像素。
我想拍摄200张图像中的每一张(1,1000,1000)
,对图像部分(1000,1000)
执行操作,然后将其连接/连接到全新的数组。
new_array = np.array([])
for image in original_array:
new_array = np.concatenate(new_array,original_array[0].operation())
由于执行了操作,新数组最终将与原始(200,1,1000,1000)
完全相同,只是具有不同的图像。
加成:
我怎么才能在阵列的某个百分比上进行操作,比如50%?
这将输出(100,1,1000,1000)
答案 0 :(得分:3)
避免在循环中调用np.concatenate
。它分配一个新数组并复制所有内容。这很慢,如果丢弃的副本堆积而不进行垃圾回收,则可能会遇到内存问题。
如何完成此操作主要取决于您对图像执行的操作。大多数numpy操作都适用于多维数组。
尝试用numpy数组函数表示操作。例如,将图像标准化为0..1的范围可以这样做:
new_array = original_array - original_array.min(axis=(-1, -2), keepdims=True)
new_array /= new_array.max(axis=(-1, -2), keepdims=True)
如果图像操作太复杂而无法分解为numpy函数,请先分配新数组并进行修改。
new_array = np.empty_like(original_array)
for i in range(new_array.shape[0]):
new_array[i] = complicated_operation(original_array[i])
或复制原始数组并仅在副本上工作:
new_array = original_array.copy()
for image in new_array:
image[:] = complicated_operation(image)
出于某种原因,您不想预先分配,然后将图像存储在临时的数组列表中并最终将它们连接起来:
new_images = []
for image in original_array:
new_images.append(image.operation())
new_array = np.stack(new_images)
如果你真的想连续连接数组,请注意要连接的数组作为一个序列传递给函数,如下所示:
new_array = np.array([])
for image in original_array:
new_array = np.concatenate([new_array, image.operation()])
加分:查找slicing。这是非常基本的numpy / Python,绝对应该在你的工具箱中。
original_array[::2, :, :, :] # take every second image