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

2024-04-26 22:56:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个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以类似的方式填充单元格。你知道吗

任何帮助或见解将不胜感激!你知道吗


Tags: innumpyforgetlenrangesomearray
1条回答
网友
1楼 · 发布于 2024-04-26 22:56:10

我认为您要寻找的是accumulator函数,特别是cumsum,因为您要将前面的结果和当前的结果相加。你知道吗

让我们为第一列写一个等式,其中x[i]是第一列第i行的值,函数(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)

现在你可以展开方程,用上面的方程替换这些值(例如,用0替换第二个方程中的x[i],用上面的方程替换第三个方程中的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就是cumsum([函数(i)表示范围(n)中的i)])

你的情况应该是这样的:

import numpy as np
from numpy.random import randint

def random_func(seq1_i):
    return seq1_i ** 2

seq1 = randint(0, 10, size=10)
seq2 = randint(0, 10, size=15)
x = np.zeros((len(seq1)+1, len(seq2)+1))
x[1:,0] = np.cumsum([random_func(seq1[i]) for i in range(len(seq1))])
x[0,1:] = np.cumsum([random_func(seq2[i]) for i in range(len(seq2))])

其中random_func(x)在您的例子中是get_pair_score(x, GAP, score_dict)。 如果您可以将get\u pair\u score()操作矢量化,这样您就可以np.cumsum公司(获取\u对\u列表)

相关问题 更多 >