如何将这段C代码转换为Python?

0 投票
4 回答
6463 浏览
提问于 2025-04-16 04:10

我正在尝试把我手上的这段C代码转换成Python脚本,这样更多人就能使用了,但我在理解其中一个片段时遇到了问题。

int i, t;
for (i = 0; i < N; i++) {
   t = (int)(T*drand48());
   z[i] = t;
   Nwt[w[i]][t]++;
   Ndt[d[i]][t]++;
   Nt[t]++;
}

N是一个值(是一个数组中某一列的总和。Elemental纠正了我)。

T只是一个数字值。

z、w和d是从N数组中分配的内存。它们是通过这种方法创建的。

w = ivec(N);
d = ivec(N);
z = ivec(N);

int *ivec(int n) //
{
   int *x = (int*)calloc(n,sizeof(int));
   assert(x);
   return x;
}

Nwt和Ndt也是数组,每个元素都是一个内存分配?(不太确定)。至少,它们都是通过以下方法创建的,传入了两个不同的整数。

Nwt = dmat(W,T);
Ndt = dmat(D,T);

double **dmat(int nr, int nc) //
{
   int N = nr*nc;
   double *tmp = (double*) calloc(N,sizeof(double));
   double **x  = (double**)calloc(nr,sizeof(double*));
   int r;
   assert(tmp);
   assert(x);
   for (r = 0; r < nr; r++) x[r] = tmp + nc*r;
   return x;
}

看一下我发的第一个循环,接下来的几行代码在做什么?我想在Python中实现同样的功能,但因为不需要内存分配,所以不太明白那三行代码的作用,或者我该如何在Python中复制它。

Nwt[w[i]][t]++;
Ndt[d[i]][t]++;
Nt[t]++;

这是我目前的进展:

for i in range(self.N):
        t = self.T * random.random()
        self.z[i] = t
        //** INCORRECT BELOW **
        //self.Nwt[self.N[i]] = t + 1 
        //self.Ndt[i] = t + 1
        //self.Nt[t + 1] += 1

4 个回答

1

NwtNdt二维数组。这几行的意思是:

Nwt[w[i]][t]++;
Ndt[d[i]][t]++;

在每个数组的某个位置上,把值加1。如果你把地址理解为 array[column][row],那么列的选择是根据另一个一维数组 wd(分别对应索引 i)中的值来决定的。t 看起来是一个随机的索引。

你没有展示 dmat 函数在做什么,所以很难具体分析这个部分。

(我无法帮你解决 Python 方面的问题,希望这能帮助你理解 C 语言的部分)

2

关于Python的部分,建议使用numpy数组来表示矩阵(可能也包括数组)。不过老实说,你现在不需要太担心这个。那段C代码看起来很复杂。除此之外,不同的编程语言有不同的方法来实现相同的功能,这就是为什么转换代码会很困难。试着理解一下它实现的算法(假设它确实在做这个),然后用一种不依赖于特定语言的方式把它写下来。接着再想想你怎么用Python来实现它。

1

在你的内容中,我首先会关注变量名称是否合理,特别是那些数组的名称。总的来说,大部分内容是可以直接理解的。

Nwt和Ndt是二维数组,Nt是一个一维数组。看起来你是在遍历z数组中的所有“列”,并为每一列生成一个随机数。然后,你会在Nwt(对应行w[i])、Ndt(对应行d[i])和Nt中增加你选中的那一列的计数。实际的随机值会存放在z里。

#Literal translation
for i in range(N):
    t = Random.randint(0,T) #Not sure on this... but it seems likely.
    z[i] = t
    Nwt[w[i]][t] += 1
    Ndt[d[i]][t] += 1
    Nt[t] += 1

#In place of w= ivec(N);
w = [0]*N
d = [0]*N
z = [0]*N

#In place of Nwt = dmat(W,T)
Nwt = [[0.0] * T] * W
Ndt = [[0.0] * T] * D

编辑:把w/d/z的初始化从“n”改成了“N”。

注意,这里还有一些问题,因为看起来N必须等于W和D……所以要小心处理。

撰写回答