Matlab代码:
AP(queryIdx) = diff([0;recall]')*prec
我的python代码:
AP[queryIdx] = np.dot(np.diff(np.concatenate(([[0]], recall), axis=0).transpose()),prec)
变量:(已检查并且非常确定它们在python和Matlab中是等效的)
Recall: 1000x1 np array*
prec: 1000x1 np array
*打印为[[。],.....,[。]]
结果: Matlab:.1011 Python:0.05263158
只因为我能想到代码之外的是python使用更多 精确,但我怀疑会产生如此大的差异)
*编辑我的prec变量出现问题。上面的代码工作
答案 0 :(得分:0)
那段代码看起来有些乱。尝试用它替换它:
AP[queryIdx] = np.dot(np.diff(np.hstack([0, recall.ravel()])), prec.ravel())
在您的帖子中,您提到了recall
和prec
都有一个1000 x 1的数组。这对我来说被解释为具有单一维度的二维数组:第二维。因此,您需要使用ravel
将其转换回一维数组。
现在,np.hstack
将1D阵列水平堆叠在一起,因此这将在前面附加0,然后应用diff
运算符,并使用prec
执行点积。
MATLAB编码器与numpy
的一个常见问题是numpy
中1D数组的表示。没有1D阵列的转置这样的东西。所有numpy
1D数组都是行向量。如果您明确要将1D数组设为列向量,则需要包含其他维度并使第二个维度为1,然后对其进行转置。像这样:
r = v[:][None].T
无论如何,让我们验证结果:
>> recall = (1:1000).';
>> prec = (1000:-1:1).';
>> diff([0; recall].')*prec
ans =
500500
In [1]: import numpy as np
In [2]: recall = np.arange(1,1001)
In [3]: prec = np.arange(1000,0,-1)
In [4]: np.dot(np.diff(np.hstack([0, recall.ravel()])), prec.ravel())
Out[4]: 500500