将函数应用于数组,其中函数的因素之一取决于数组的行索引

时间:2019-02-28 03:04:54

标签: python arrays numpy time

对于我的一个项目,我需要通过以下方式将函数应用于数组:

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)

1 个答案:

答案 0 :(得分:1)

当前,在for循环中,第一次迭代创建a,随后的迭代将matrix连接到a。每个这样的连接都是昂贵的操作,重复连接绝对不是一个好主意。

请勿在{{1​​}}循环内创建或连接到a

选项1:

for循环中,只需累积forlist返回的matrix对象的引用。退出value_function循环后,仅将for设为one call,将矩阵对象列表作为第一个参数传递。

选项2:

如果事先知道返回矩阵对象的确切大小(元素数)(在numpy.concatenate()循环之前),请使用这些数字预先创建for数组(在{{1之前) }}循环),完整大小,但不进行任何初始化。为此,您可以使用a

然后,在for循环内,使用每个矩阵对象对此完整尺寸numpy.empty()数组的相关部分执行分配。同样,我们避免重复连接,因此肯定会加快处理速度。