从Numpy数组中的元素创建新的Numpy数组

时间:2017-07-25 03:33:12

标签: image numpy

似乎无法想出这一个。非常新的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)

的数组

1 个答案:

答案 0 :(得分:3)

避免在循环中调用np.concatenate。它分配一个新数组并复制所有内容。这很慢,如果丢弃的副本堆积而不进行垃圾回收,则可能会遇到内存问题。

如何完成此操作主要取决于您对图像执行的操作。大多数numpy操作都适用于多维数组。

  1. 尝试用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)
    
  2. 如果图像操作太复杂而无法分解为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)
    
  3. 出于某种原因,您不想预先分配,然后将图像存储在临时的数组列表中并最终将它们连接起来:

    new_images = []
    for image in original_array:
        new_images.append(image.operation())
    new_array = np.stack(new_images)
    
  4. 如果你真的想连续连接数组,请注意要连接的数组作为一个序列传递给函数,如下所示:

    new_array = np.array([])
    for image in original_array:
        new_array = np.concatenate([new_array, image.operation()])
    
  5. 加分:查找slicing。这是非常基本的numpy / Python,绝对应该在你的工具箱中。

      original_array[::2, :, :, :]  # take every second image