MatlabPython翻译

2024-09-27 00:22:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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变量有问题。上面的代码起作用了


Tags: 代码npdiff原因arraydotaptranspose
1条回答
网友
1楼 · 发布于 2024-09-27 00:22:28

代码看起来有点乱。尝试将其替换为:

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

在您的帖子中,您提到您有一个1000 x 1的数组,用于recallprec。在我看来,这是一个二维数组,具有一个单一维度:第二维度。因此,您需要使用ravel将其转换回1D数组。你知道吗

现在,np.hstack水平地将1D数组堆叠在一起,因此这将在前面附加一个0,然后应用diff操作符,并用prec执行点积。你知道吗

MATLAB编码器在numpy中的一个常见问题是numpy中一维数组的表示。没有一维数组的转置。所有numpy1D数组都是行向量。如果您显式地想使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

相关问题 更多 >

    热门问题