大量元素比较

时间:2019-03-18 22:43:54

标签: python numpy vectorization

我正在尝试做这样的事情:

Dim sheetsArray As Sheets
    Set sheetsArray = ThisWorkbook.Sheets(Array("Project", "Project 2", "Project 3", "Project 4"))


    Application.ScreenUpdating = False
    If ShowHide1.Name = "Show All Projects" Then

        For Each sheet In sheetsArray
            sheet.Visible = xlSheetVisible
        Next sheet

        ShowHide1.Name = "Hide All Projects"

        Sheet1.Activate
    Else

        For Each sheet In sheetsArray
            If (sheet.Name <> ShowHide1.Name And sheet.Name <> AlwaysShow.Name) Then
               sheet.Visible = xlSheetVeryHidden
            End If
        Next sheet

        ShowHide1.Name = "Show All Projects"


    Set sheetsArray = ThisWorkbook.Sheets(Array("Jagger1", "Jagger2", "Jagger3", "Jagger4"))


    Application.ScreenUpdating = False
    If ShowHide1.Name = "Show All Jagger" Then

        For Each sheet In sheetsArray
            sheet.Visible = xlSheetVisible
        Next sheet

        ShowHide1.Name = "Hide Jagger"

        Sheet1.Activate
    Else

        For Each sheet In sheetsArray
            If (sheet.Name <> ShowHide1.Name And sheet.Name <> AlwaysShow.Name) Then
               sheet.Visible = xlSheetVeryHidden
            End If
        Next sheet

        ShowHide1.Name = "Show all Jagger"


        AlwaysShow.Activate
    End If
    Application.ScreenUpdating = True
End Sub

其中r i ,c i ∈{0,1,2,...,n}分别是行索引和列索引,而I [· ]是一种指标函数,如果条件为true,则值为1,否则为0。

我在进行此设置时遇到了麻烦。我可以通过以下方式轻松遍历一切

I[ xr1,c1 > xr2,c2 ]

但是,我试图向量化此代码以提高效率并一举完成比较。我怎样才能做到这一点?我正在使用 numpy


说明更新:

我正在训练一个简单的微笑分类器,该分类器分析灰度图像 x ∈R 24×24 并输出预测y∈{0,1},指示是否图像在微笑(1)或不是(0)。分类器将基于输入图像的非常简单的功能(包括像素值之间的二进制比较)做出决定。

每个功能的计算方式为:

for r1 in range(0,n):
    for c1 in range(0,n):
        for r2 in range(0,n):
            for c2 in range(0,n):
                #do something with (r1,c1,r2,c2)

其中r i ,c i ∈{0,1,2,...,n}分别是行索引和列索引,而I [· ]是一个指标函数,如果条件为true,则值为1,否则为0。 (假设已定义n)

根据我到目前为止提到的内容,我正在尝试为5个功能训练一个整体的微笑分类。如果认为图像正在微笑,则合奏的输出为1,否则为0。这由整个5个成员的平均预测确定。如果5个合奏预测变量中有超过一半的人认为图像在微笑,则合奏说这是微笑;否则,合奏表示没有笑。

这就是我想要做的:

在每个回合j中,我想选择第j个特征(r1,c1,r2,c2),以便–将其添加到已选择的j-1个特征集合中时–总体精度训练集上的分类器被最大化。更具体地说,在每个回合j,如果当前元组是最好的(对于回合j),我正在考虑每个可能的像素位置元组(r1,c1,r2,c2),然后将其保存为我的“迄今为止最好的”代表第j轮。如果没有,我会忽略它。然后,我继续到下一个可能的像素位置元组,并重复直到搜索完所有像素为止。在第j轮结束时,我将为该轮选择最佳功能,并将其添加到我选择的功能集中。一旦添加,它将永久保留在集合中–永远无法删除。 (否则,完全不会采用协商一致的算法。)然后我继续进行j + 1轮,直到您完成了所有5轮回合。

我不需要整件事。我只是在寻找一种矢量化代码的方法,而不必使用嵌套的循环

1 个答案:

答案 0 :(得分:3)

利用 broadcasting

#include <stdio.h>

void main()
{
    int first, second;
    int answer = 1;

    while (answer == 1)
    {
        puts("Please enter the first integer ==> ");
        scanf("%d", &first);

        puts("Please enter the second integer ==> ");
        scanf("%d", &second);

        printf("%s", "The sum of %d", first , " and %d", second, " is %d", first + second);

        puts("Would you like to add two more integers?\n"
              "(1 for yes) ==> ");
              scanf("%d", &answer);

    }
}

或者,我们可以使用first = np.reshape(array, (*array.shape, 1, 1)) second = np.reshape(array, (1, 1, *array.shape)) result = (first > second) ,它对元素的每个唯一排列进行大于的比较:

np.greater.outer

这将产生形状为result = np.greater.outer(array, array) 的{​​{1}},其中np.ndarray是您想要的值。

示例:

(*array.shape, *array.shape)

输出:

result[r1, c1, r2, c2]