我想创建一个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填充单元格的方法。
任何帮助或见解将不胜感激!
让我们写第一列的方程式,其中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)])
您可以将相同的概念应用于第一行