填充多个数组以获得与最大数组相同的形状

时间:2018-08-01 20:11:36

标签: python arrays python-3.x numpy pad

我有多个2D数组保存在名为image_concat的列表中。这个列表将由一百多个这些数组组成,但是现在我只是想让我的代码只为其中两个运行一个列表。这些数组都有不同的形状,我想在所有数组中找到最大的x维度和最大的y维度,然后在所有其他数组的边缘周围填充足够的零,以便最终,所有具有相同的形状。请注意,最大的x维度和最大的y维度可能属于单独的数组,或者它们可能属于同一数组。到目前为止,由于某些原因,我尝试编写的内容并未成功更改较小数组的形状。但我也认为,即使更改形状后也会出现一些问题,因为由于形状中的元素为偶数或奇数,某些数组最终可能会偏离一个。

import astropy
import numpy as np
import math
import matplotlib.pyplot as plt
from astropy.utils.data import download_file
from astropy.io import fits

images = ['http://irsa.ipac.caltech.edu/ibe/data/wise/allsky/4band_p1bm_frm/9a/02729a/148/02729a148-w2-int-1b.fits?center=89.353536,37.643864deg&size=0.6deg', 'http://irsa.ipac.caltech.edu/ibe/data/wise/allsky/4band_p1bm_frm/2a/03652a/123/03652a123-w4-int-1b.fits?center=294.772333,-19.747157deg&size=0.6deg']

image_list = []
for url in images:
    image_list.append(download_file(url, cache=True))

image_concat = [fits.getdata(image) for image in image_list]

# See shapes in the beginning
print(np.shape(image_concat[0]))
print(np.shape(image_concat[1]))

def pad(image_concat):

    # Identify largest x and y dimensions
    xdims, ydims = np.zeros(len(image_concat)), np.zeros(len(image_concat))
    for i in range(len(xdims)):
        x, y = np.shape(image_concat[i])
        xdims[i] = x
        ydims[i] = y
    x_max = int(np.max(xdims))
    y_max = int(np.max(ydims))

    # Pad all arrays except the largest dimensions
    for A in image_concat:
        x_len, y_len = np.shape(A)
        print(math.ceil((y_max-y_len)/2))
        print(math.ceil((x_max-x_len)/2))

        np.pad(A, ((math.ceil((y_max-y_len)/2), math.ceil((y_max-y_len)/2)), (math.ceil((x_max-x_len)/2), math.ceil((x_max-x_len)/2))), 'constant', constant_values=0)

    return image_concat

image_concat = pad(image_concat)

# See shapes afterwards (they haven't changed for some reason)
print(np.shape(image_concat[0]))
print(np.shape(image_concat[1]))

我不明白为什么这种情况下形状没有变化。而且,是否有一种方法可以轻松地对此进行概括,以使其适用于许多数组,而不管它们的尺寸是偶数还是奇数?

1 个答案:

答案 0 :(得分:2)

np.pad不会就地修改数组,而是返回一个填充数组。因此,您需要执行image_concat[i] = np.pad(...),其中iA的索引。