对于我的一个项目,我需要通过以下方式将函数应用于数组:
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的行号(i表示该行)。
对于alpha因子也应执行相同的操作,其中alpha将除以行号(i再次表示行号)。
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)
答案 0 :(得分:1)
当前,在for
循环中,第一次迭代创建a
,随后的迭代将matrix
连接到a
。每个这样的连接都是昂贵的操作,重复连接绝对不是一个好主意。
请勿在{{1}}循环内创建或连接到a
。
选项1:
在for
循环中,只需累积for
对list
返回的matrix
对象的引用。退出value_function
循环后,仅将for
设为one call
,将矩阵对象列表作为第一个参数传递。
选项2:
如果事先知道返回矩阵对象的确切大小(元素数)(在numpy.concatenate()
循环之前),请使用这些数字预先创建for
数组(在{{1之前) }}循环),完整大小,但不进行任何初始化。为此,您可以使用a
。
然后,在for
循环内,使用每个矩阵对象对此完整尺寸numpy.empty()
数组的相关部分执行分配。同样,我们避免重复连接,因此肯定会加快处理速度。