从较小的矩阵填充较大的矩阵

Jan*_*usz 4 python arrays numpy matrix

我必须使用由较小的2D阵列制成的块填充较大的2D阵列,但仍然考虑到比新的大2D阵列边缘处的块的宽度更少的列行数.例如,使用3x3块从左侧阵列右侧创建阵列.

[[ 1  2  3  4]         [[  1.   1.   1.   2.   2.   2.   3.   3.   3.   4.   4.]
 [ 5  6  7  8]    ->    [  1.   1.   1.   2.   2.   2.   3.   3.   3.   4.   4.]
 [ 9 10 11 12]]         [  1.   1.   1.   2.   2.   2.   3.   3.   3.   4.   4.]
                        [  5.   5.   5.   6.   6.   6.   7.   7.   7.   8.   8.]
                        [  5.   5.   5.   6.   6.   6.   7.   7.   7.   8.   8.]
                        [  5.   5.   5.   6.   6.   6.   7.   7.   7.   8.   8.]
                        [  9.   9.   9.  10.  10.  10.  11.  11.  11.  12.  12.]]
Run Code Online (Sandbox Code Playgroud)

我实现了如下所示,但我正在寻找一种更聪明的方法.

# Smaller array
a=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])

# The size of the blocks for filling in the matrix
blockSize = 3

# The number of columns and rows of the new matrix (b)
cols = 11
rows = 7
b = np.zeros([rows, cols])

for i in range(0, rows, blockSize):
    ii = i/blockSize
    if i + blockSize < rows:
        numRows = blockSize
    else:
        numRows = rows - i
    for j in range(0, cols, blockSize):
        jj= j/blockSize
        if j + blockSize < cols:
            numCols = blockSize
        else:
            numCols = cols - j

        b[i:i+numRows,j:j+numCols] = a[ii,jj]
Run Code Online (Sandbox Code Playgroud)

Ale*_*ley 5

你可以分两个阶段重复; 一次为列,一次为行.

a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
blockSize = 3
cols = 11
rows = 7
Run Code Online (Sandbox Code Playgroud)

每一次,重复为每个元素的数量的列表是从计算blockSize和任一rowscols(例如[3, 3, 3, 2]针对列).这将创建一个所需大小的数组:

>>> result = a.repeat([blockSize]*(cols//blockSize) + [cols % blockSize], axis=1)
>>> result = result.repeat([blockSize]*(rows//blockSize) + [rows % blockSize], axis=0)
>>> result
array([[ 1,  1,  1,  2,  2,  2,  3,  3,  3,  4,  4],
       [ 1,  1,  1,  2,  2,  2,  3,  3,  3,  4,  4],
       [ 1,  1,  1,  2,  2,  2,  3,  3,  3,  4,  4],
       [ 5,  5,  5,  6,  6,  6,  7,  7,  7,  8,  8],
       [ 5,  5,  5,  6,  6,  6,  7,  7,  7,  8,  8],
       [ 5,  5,  5,  6,  6,  6,  7,  7,  7,  8,  8],
       [ 9,  9,  9, 10, 10, 10, 11, 11, 11, 12, 12]])
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用类似的np.kron方法创建每个元素的块,然后将数组切片到所需的大小.但是,这会首先创建一个可能比所需大得多的数组(并且可能对内存效率低下).

np.kron(a, np.ones((blockSize, blockSize)))[:rows, :cols]
Run Code Online (Sandbox Code Playgroud)