Python Numpy元素级比较

Python Numpy元素级比较,python,numpy,vectorization,Python,Numpy,Vectorization,我正在尝试这样做: I[ xr1,c1 > xr2,c2 ] 然而,我正试图将这段代码矢量化,以提高效率,并在一个同事的swoop中进行比较。我该怎么做?我正在使用numpy 解释更新: 我正在训练一个简单的微笑分类器来分析灰度图像∈ R24×24并输出预测y∈ {0,1},指示图像是否在微笑(1)或不在微笑(0)。分类器将根据由像素值之间的二进制比较组成的输入图像的非常简单的特征做出决策 每个特征的计算公式为:I[xr1,c1>xr2,c2] I[ xr1,c1 > xr2,c2 ] 其中r

我正在尝试这样做:

I[ xr1,c1 > xr2,c2 ]
然而,我正试图将这段代码矢量化,以提高效率,并在一个同事的swoop中进行比较。我该怎么做?我正在使用numpy


解释更新:

我正在训练一个简单的微笑分类器来分析灰度图像∈ R24×24并输出预测y∈ {0,1},指示图像是否在微笑(1)或不在微笑(0)。分类器将根据由像素值之间的二进制比较组成的输入图像的非常简单的特征做出决策

每个特征的计算公式为:
I[xr1,c1>xr2,c2]

I[ xr1,c1 > xr2,c2 ]
其中ri,ci∈ {0,1,2,…,n}分别是行和列索引,I[·]是一个指示函数,如果条件为真,则其值为1,否则为0。(假设定义了n)

根据我到目前为止提到的内容,我正在尝试为5个特征训练一个整体微笑分类。如果集合认为图像是微笑的,则其输出为1,否则为0。这是由集合中所有5个成员的平均预测决定的。如果超过一半的5组预测者认为图像是微笑的,那么组说这是微笑;否则,乐团说它没有笑

这就是我想做的:

在每一轮j中,我想选择第j个特征(r1、c1、r2、c2),当它被添加到j集合中时−1已选择的特征–最大限度地提高训练集上整个分类器的精度。更具体地说,在每一轮j中,我都在考虑每个可能的像素位置元组(r1、c1、r2、c2),如果当前元组是迄今为止最好的(对于轮j),那么我将其保存为我在轮j中看到的“迄今为止最好的”。如果不是,我就忽略它。然后我转到下一个可能的像素位置元组,并重复,直到我搜索了所有像素位置。在第j轮结束时,我将为该轮选择最佳功能,并将其添加到我的选定功能集中。一旦添加,它将永远留在场景中,永远无法删除。(否则,这根本不是一个令人满意的算法。)然后我继续进行第j+1轮,直到你完成所有5轮

这整件事我不需要帮助。我只是在寻找一种无需使用嵌套for循环即可对代码进行矢量化的方法利用:

或者,我们可以使用
np.greater.outer
,它对元素的每个唯一排列执行大于比较:

result = np.greater.outer(array, array)
这将生成一个
np.ndarray
形状
(*array.shape,*array.shape)
,其中
结果[r1,c1,r2,c2]
是您想要的值

例如:

array = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])

first = np.reshape(array, (*array.shape, 1, 1))
second = np.reshape(array, (1, 1, *array.shape))

result = (first > second)

print(result[0, 0, 1, 1]) # 1 > 6
print(result[1, 1, 0, 1]) # 6 > 2
print(result[0, 3, 0, 2]) # 3 > 2
输出:

False
True
True

所以你有一个正方形矩阵?如果我理解正确,你应该有24*24的特征…?我有点困惑。如果(r1,c1)和(r2,c2)的值大于(r1,c1),那么我如何使用它来比较(r1,c1)和(r2,c2)并执行某些操作?这取决于您想要执行的操作(操作是否可以矢量化)?在任何情况下,此代码段都将生成一个4D数组
result
,其中每个元素都是一次比较的结果。
(x{r1,c1})>(x{r2,c2})
的结果将存储在
结果[r1,c1,r2,c2]
中。我认为这可能比它需要的复杂一点。对不起,我很难解释我想做什么(我第一次接触到这种东西)。你介意我链接到一个有更详细说明的文档吗?我不介意,但我不确定这是否违反SO规则(不过,最好你能解释一下你想要做这个比较的确切原因)@Hello解释你想要什么的最好方法是做一些小的(例如,5x5)作为示例输入,并基于这些,输入您的预期输出
array = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])

first = np.reshape(array, (*array.shape, 1, 1))
second = np.reshape(array, (1, 1, *array.shape))

result = (first > second)

print(result[0, 0, 1, 1]) # 1 > 6
print(result[1, 1, 0, 1]) # 6 > 2
print(result[0, 3, 0, 2]) # 3 > 2
False
True
True