对于我的一个项目,我需要以下列方式将函数应用于数组:
a = value_function(arr, beta=beta_adj(beta, T = i), alpha = alpha/i)
其中value_function是需要应用于数组arr以创建目标数组a的函数。
beta是value_function的输入,由另一个名为beta_adj的函数决定,该函数将两个值作为输入(beta和T)。
beta_adj(beta, T = i)
T因子应该等于数组arr的行号(我在那里表示)。
对于α因子也应该这样做,其中alpha将除以行号(我再次指示行号)。
alpha = alpha / i
有没有办法提高时间效率,避免使用for循环迭代每个数组行(参见下面的示例)?
for i in range(len(arr)):
if i == 0:
a = value_function(arr[0], beta=beta_adj(beta, T = i), alpha = alpha/i )
else:
a = np.concatenate((a, np.matrix(value_function(arr[i], beta=beta_adj(beta, T = i), alpha = alpha/i)))), axis = 0)
在for
循环中,目前,第一次迭代创建a
,随后的迭代将matrix
连接到a
。每个这样的连接都是一个昂贵的操作,重复连接绝对是一个坏主意。
不要在a
循环内创建或连接for
。
选项1:
在for
循环中,只是继续积累list
引用matrix
返回的value_function
对象。退出for
循环后,只需将one call
发送到numpy.concatenate()
,将矩阵对象列表作为第一个参数传递。
选项2:
如果事先知道返回的矩阵对象的确切大小(元素数)(在for
循环之前),请使用这些数字预先创建a
数组(在for
循环之前),以其完整大小,但不进行任何初始化。为此,您可以使用numpy.empty()
。
然后,在for
循环内,使用每个矩阵对象执行对此全尺寸a
数组的相关部分的赋值。同样,我们避免重复连接,这样一定会加快速度。