Numpy:如何使用另一个数组作为模板来调整随机数组的大小

时间:2015-04-30 16:16:43

标签: python numpy

我有一个像这样的5x5数组:

array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

我也有这样的3x3阵列:

array([[ 1.,  0., 1.],
       [ 0.,  1., 0.]])

我想将3x3阵列合并到5x5阵列中,以便它看起来像:

array([[ 1.,  0.,  1.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

类似地,我可能有其他具有各种维度的数组(25,25),(15,13),(2,8)等。使用5x5零作为模板合并的最佳方法是什么其他数组进入它?

例如,假设我的"模板"数组为零((5,5))。我有另一个数组((12,12))。我想调整它们的大小((12,12)),使它的新大小为5x5。关于"额外"行/列:应忽略最后7行和最后7列。

是否有内置的numpy方法可以实现此目的?

2 个答案:

答案 0 :(得分:1)

您可以先找到第二个数组的形状,然后使用indexing将第二个数组应用到第一个数组:

>>> import numpy as np
>>> a=np.array([[ 0.,  0.,  0.,  0.,  0.],
...        [ 0.,  0.,  0.,  0.,  0.],
...        [ 0.,  0.,  0.,  0.,  0.],
...        [ 0.,  0.,  0.,  0.,  0.],
...        [ 0.,  0.,  0.,  0.,  0.]])
>>> b=np.array([[ 1.,  0., 1.],
...           [ 0.,  1., 0.]])

>>> i,j=b.shape
>>> a[:i,:j]=b
>>> a
array([[ 1.,  0.,  1.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

但是,当数组b大于a时,您希望将a的元素替换为b元素,则可以将其分割为形状为b的{​​{1}}数组,然后分配给a

a

答案 1 :(得分:1)

我最终这样做了:

def reshape_array(orig_array):
    max_x = 5
    max_y = 5
    rows, cols = orig_array.shape
    if rows < max_x:
        new_row_len = max_x - rows
    elif rows >= max_x:
        new_row_len = 0
    if cols < max_y:
        new_col_len = max_y - cols
    elif cols >= max_y:
        new_col_len = 0
    new_x = np.zeros((new_row_len, cols))
    new_y = np.zeros((max_y, new_col_len))

    result = np.copy(orig_array)
    result = np.delete(result, np.s_[max_y:], axis=1)
    result = np.delete(result, np.s_[max_x:], axis=0)

    if not len(new_x) == 0:
        result = np.append(result, new_x, axis=0)
    if not len(new_y) == 0:
        result = np.append(result, new_y, axis=1)
    return result

我使用reshape_array()

成功测试了以下数组
a = np.ones((3, 3))
b = np.ones((5, 5))
c = np.ones((2, 4))
d = np.ones((10, 10))