需要使用numpy functinoality来提高代码效率

时间:2018-03-24 02:49:35

标签: python numpy

我是使用NumPy的新手,但我相信它是我加速代码所需的工具。以下是我希望我的代码完成的内容:

对于2D numpy数组(T)中的每一行,我想知道对于另一个数组(T_cuts)中的每个截止值,满足依赖于截止值的四个条件中的每一个的元素数量,所有这些都用作as尽可能少的循环。

这是一个关于如何使用for循环来完成此任务的草图:

for row in T:             
    classification_counts = []
    for cut in T_cuts:       
        results = []
        for element in row:   
            results.append(classify(element, cut))
        ones = results.count(1)
        twos = results.count(2)
        threes = results.count(3)
        fours = results.count(4)
        classification_counts.append([ones, twos, threes, fours])

辅助函数classify只返回1,2,3或4,具体取决于T元素与T_cuts的截止值之间的关系。

对于这个问题T.shape == (1000000,80)T_cuts.shape == (3000,1),所以使用循环已经证明太慢了。

编辑:包括classify的完整定义。数组corr_stats包含T的每个元素来自何处的信息,第一列是" type1"或" type2"。

def classify(cutoff, element):
    i, j = np.where( T == element )
    if element >= cutoff and corr_stats[j,0] == "type1":
        return 1
    elif element >= cutoff and corr_stats[j,0] == "type2":
        return 2
    elif element < cutoff and corr_stats[j,0] == "type2":
        return 3
    elif element < cutoff and corr_stats[j,0] == "type1":
        return 4
    else:
        return 0

1 个答案:

答案 0 :(得分:0)

我将只讨论最里面的循环:

    results = []
    for element in row:   
        results.append(classify(element, cut))
    ones = results.count(1)
    twos = results.count(2)
    threes = results.count(3)
    fours = results.count(4)
    classification_counts.append([ones, twos, threes, fours])

这里我们在行中每个单元格调用classify()一次,唯一重要的结果是我们得到的每个值的数量。

要消除内循环,我们需要做这样的事情:

    classification_counts.append(classify(row, cut))

所以:

def classify(row, cutoff):
    greater = row >= cutoff
    one = corr_stats == 1
    two = corr_stats == 2
    return \
        (greater & one).sum(),
        (greater & two).sum(),
        (~greater & two).sum(),
        (~greater & one).sum()

以上假设corr_stats转换为提高效率。具体来说,您应该用数字1和2替换“type1”和“type2”字符串,并组织corr_stats使其与行值对齐,以避免必须使用np.where()在T中查找每个元素的位置。最后一部分可能需要一些思考(我不知道如何完全弄明白)。

相关问题