如何无需循环,用一维NumPy数组填充不同维度的多维数组?
无需循环的NumPy数组填充方案
要实现将一维数组data(长度100)填充到形状为(100, 10, 10)的数组all2中(使每个all2[i, j, k]等于data[i]),完全可以不用三重循环,以下是几种高效优雅的实现方式:
方法1:利用NumPy广播机制(推荐)
通过给data增加两个单维度,让其形状变为(100, 1, 1),赋值时NumPy会自动将其广播到目标数组的形状,这种方式无需额外复制数据,性能最优:
import numpy as np data = np.arange(0, 100) all2 = np.empty((100, 10, 10)) # 两种维度扩展方式任选其一 all2[:] = data[:, np.newaxis, np.newaxis] # 或者 # all2[:] = data.reshape(100, 1, 1)
方法2:使用np.tile函数
tile函数可以将数组按指定次数重复,先把data调整为(100,1,1)的形状,再在第2、3维度各重复10次:
import numpy as np data = np.arange(0, 100) all2 = np.tile(data.reshape(100, 1, 1), (1, 10, 10))
方法3:使用np.repeat函数
通过两次repeat操作,分别在第2、3维度重复数据:
import numpy as np data = np.arange(0, 100) # 先在第2维度重复10次,再在第3维度重复10次 all2 = np.repeat(np.repeat(data.reshape(100, 1), 10, axis=1), 10, axis=2)
以上三种方法都能替代三重循环,其中广播机制的内存效率最高,是最推荐的实现方式。
内容的提问来源于stack exchange,提问作者MichaelW
相关产品推荐
相关产品推荐

