将函数应用于数组,其中一个函数的因子依赖于数组的行索引

问题描述 投票:0回答:1

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

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)
python arrays numpy time
1个回答
1
投票

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数组的相关部分的赋值。同样,我们避免重复连接,这样一定会加快速度。

© www.soinside.com 2019 - 2024. All rights reserved.