Matlab-Python翻译错误

时间:2015-06-24 22:03:09

标签: python matlab numpy

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变量出现问题。上面的代码工作

1 个答案:

答案 0 :(得分:0)

那段代码看起来有些乱。尝试用它替换它:

AP[queryIdx] = np.dot(np.diff(np.hstack([0, recall.ravel()])), prec.ravel())

在您的帖子中,您提到了recallprec都有一个1000 x 1的数组。这对我来说被解释为具有单一维度的二维数组:第二维。因此,您需要使用ravel将其转换回一维数组。

现在,np.hstack将1D阵列水平堆叠在一起,因此这将在前面附加0,然后应用diff运算符,并使用prec执行点积。

MATLAB编码器与numpy的一个常见问题是numpy中1D数组的表示。没有1D阵列的转置这样的东西。所有numpy 1D数组都是行向量。如果您明确要将1D数组设为列向量,则需要包含其他维度并使第二个维度为1,然后对其进行转置。像这样:

r = v[:][None].T

无论如何,让我们验证结果:

MATLAB

>> recall = (1:1000).';
>> prec = (1000:-1:1).';
>> diff([0; recall].')*prec

ans =

      500500

Python(IPython)

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