gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:19:13 25 4
gpt4 key购买 nike

我必须用较小的二维数组制成的 block 来填充较大的二维数组,但仍要考虑比新的大二维数组边缘的 block 宽度更少的列行数。例如,使用 3x3 block 从左侧数组创建右侧数组。

[[ 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.]]

我如下所示实现了它,但我正在寻找一种更智能的方法。

# 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]

最佳答案

您可以分两个阶段重复;一次用于列,一次用于行。

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

每次,根据 blockSizerowscols 计算每个元素的重复次数列表(例如 [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]])

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

np.kron(a, np.ones((blockSize, blockSize)))[:rows, :cols]

关于python - 从较小的矩阵填充较大的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31425809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com