是否有一种有效的方法(不是for循环)来初始化numpy中的数组,其中每个单元格都是先前单元格的倍数?

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

我想创建一个numpy数组(在python中),其中轴值由上一个单元格中的值和其他函数确定。

例如:在以下示例中,y轴(行)上的值由以下方式确定:

Array[i:0] = Array[i-1:0] + 3 + some_other_func()

并且x轴(col)中的值由以下方式确定:

Array[0:i] = Array[0:i-1] + 4 + some_other_func()

[[0 4 8]

[3 0 0]

[6 0 0]

[9 0 0]]

我现在拥有的代码如下:

matrix = np.zeros((len(seq1) + 1, len(seq2) + 1))

for i in range(1, len(seq1) + 1):
        matrix[i][0] = matrix[i - 1][0] + get_pair_score(seq1[i - 1], GAP,
                                                         score_dict)
    for j in range(1, len(seq2) + 1):
        matrix[0][j] = matrix[0][j - 1] + get_pair_score(seq2[j - 1], GAP,
                                                             score_dict)

但是,运行需要很长时间(我的序列是很长的字符串...),我想知道是否有更有效的方法来执行此操作。

我知道我可以使用以下语法填充行或列:

x[:,0] = some_value
x[0,:] = some_value

但是当一个单元格中的值取决于前一个单元格时,我无法找出一种以类似方式告诉numpy填充单元格的方法。

任何帮助或见解将不胜感激!

python arrays axis numpy-ndarray
1个回答
0
投票

让我们写第一列的方程式,其中x [i]是第一列第i行的值,而function(i)是第i行的函数(即get_pair_score(seq1[i - 1], GAP, score_dict)),那么您的列值可以写为:

x[i] = 0
x[i+1] = x[i] + function(i)
x[i+2] = x[i+1] + function(i+1)
....
x[n] = x[n] + function(n-1)

现在您可以做的是扩展方程式,以便将值替换为上述方程式(例如,将第二个方程式中的x [i]替换为0,将第三个方程式中的x [i + 1]替换为上述方程式,并依此类推。)

x[i] = 0
x[i+1] = x[i] + function(i) = 0 + function(i)
x[i+2] = x[i+1] + function(i+1) = (x[i] + function(i)) + function(i+1) = (0 + function(i)) + function(i+1)
....
x[n] = 0 + function(i) + function(i+1) + function(n-2) + function(n-1)

在这里,我们看到x [a]本质上是从0到a的函数求和所以x只是一个求和([i在range(n)中的function(i)])

您的情况应该是这样的:

x[:,0] = np.cumsum([get_pair_score(seq1[i - 1], GAP, score_dict) for i in range(1, len(seq1) + 1)])

您可以将相同的概念应用于第一行

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