如何对Numpy数组进行元素重复式缩放以实现维度翻倍?
在NumPy中实现数组的块式元素重复缩放
你遇到的问题很典型——numpy.resize是按一维展平后循环填充的,所以没法实现你要的块式重复缩放(每个元素在行列方向都复制一次,形成2x2的块)。不过NumPy有好几种直接实现这个需求的方法,我给你列两个最常用的:
方法一:用numpy.repeat分步重复
这是最直观的方式,先在列方向把每个元素重复2次,再在行方向做同样的操作:
import numpy as np # 定义原数组 arr = np.array([ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16] ]) # 先列方向重复2次,再行方向重复2次 scaled_arr = arr.repeat(2, axis=1).repeat(2, axis=0) print(scaled_arr)
输出结果完全符合你的预期:
[[ 1 1 2 2 3 3 4 4] [ 1 1 2 2 3 3 4 4] [ 5 5 6 6 7 7 8 8] [ 5 5 6 6 7 7 8 8] [ 9 9 10 10 11 11 12 12] [ 9 9 10 10 11 11 12 12] [13 13 14 14 15 15 16 16] [13 13 14 14 15 15 16 16]]
方法二:用numpy.kron(克罗内克积)
如果你熟悉线性代数的话,克罗内克积可以一步到位实现这种块式扩展。我们用一个2x2的全1数组和原数组做积,相当于把原数组的每个元素都扩展成2x2的块:
scaled_arr = np.kron(arr, np.ones((2, 2), dtype=int))
运行这段代码会得到和上面完全一样的结果,代码更简洁,适合对克罗内克积熟悉的场景。
为什么numpy.resize不行?
补充说明一下你遇到的resize问题:numpy.resize会先把原数组展平成一维数组(比如你的原数组展平后是[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]),然后重复这个一维数组直到填满目标形状(8x8),所以才会出现那种按行循环填充的结果,和你要的块式缩放逻辑完全不同。
内容的提问来源于stack exchange,提问作者user16541277
相关产品推荐
相关产品推荐

