I';我想把一些python代码转换成C#,这个数组语法是什么?

I';我想把一些python代码转换成C#,这个数组语法是什么?,python,c#,arrays,Python,C#,Arrays,我正在尝试将python中的几行代码转换为C# 在C版本中,我被以heatmap#u center变量开头的列表/数组语法难住了 在下面的片段中,heatmap_with_borders变量的用途是什么 这是python片段: def extract_keypoints(heatmap, all_keypoints, total_keypoint_num): heatmap[heatmap < 0.1] = 0 heatmap_with_borders = np.pad(h

我正在尝试将python中的几行代码转换为C#

在C版本中,我被以heatmap#u center变量开头的列表/数组语法难住了

在下面的片段中,heatmap_with_borders变量的用途是什么

这是python片段:

def extract_keypoints(heatmap, all_keypoints, total_keypoint_num):
    heatmap[heatmap < 0.1] = 0
    heatmap_with_borders = np.pad(heatmap, [(2, 2), (2, 2)], mode='constant')
    heatmap_center = heatmap_with_borders[1:heatmap_with_borders.shape[0]-1, 1:heatmap_with_borders.shape[1]-1]
    heatmap_left = heatmap_with_borders[1:heatmap_with_borders.shape[0]-1, 2:heatmap_with_borders.shape[1]]
    heatmap_right = heatmap_with_borders[1:heatmap_with_borders.shape[0]-1, 0:heatmap_with_borders.shape[1]-2]
    heatmap_up = heatmap_with_borders[2:heatmap_with_borders.shape[0], 1:heatmap_with_borders.shape[1]-1]
    heatmap_down = heatmap_with_borders[0:heatmap_with_borders.shape[0]-2, 1:heatmap_with_borders.shape[1]-1]

    heatmap_peaks = (heatmap_center > heatmap_left) &\
                    (heatmap_center > heatmap_right) &\
                    (heatmap_center > heatmap_up) &\
                    (heatmap_center > heatmap_down)
    heatmap_peaks = heatmap_peaks[1:heatmap_center.shape[0]-1, 1:heatmap_center.shape[1]-1]
    keypoints = list(zip(np.nonzero(heatmap_peaks)[1], np.nonzero(heatmap_peaks)[0]))  # (w, h)
    keypoints = sorted(keypoints, key=itemgetter(0))

    suppressed = np.zeros(len(keypoints), np.uint8)
    keypoints_with_score_and_id = []
    keypoint_num = 0
    for i in range(len(keypoints)):
        if suppressed[i]:
            continue
        for j in range(i+1, len(keypoints)):
            if math.sqrt((keypoints[i][0] - keypoints[j][0]) ** 2 +
                         (keypoints[i][1] - keypoints[j][1]) ** 2) < 6:
                suppressed[j] = 1
        keypoint_with_score_and_id = (keypoints[i][0], keypoints[i][1], heatmap[keypoints[i][1], keypoints[i][0]],
                                      total_keypoint_num + keypoint_num)
        keypoints_with_score_and_id.append(keypoint_with_score_and_id)
        keypoint_num += 1
    all_keypoints.append(keypoints_with_score_and_id)
    return keypoint_num
def提取关键点(热图、所有关键点、总关键点数量):
热图[热图<0.1]=0
带边界的热图=np.pad(热图,[(2,2),(2,2)],模式=常数')
heatmap\u center=带边框的heatmap\u[1:带边框的heatmap\u.形状[0]-1,1:带边框的heatmap\u.形状[1]-1]
heatmap_left=带边框的heatmap_[1:带边框的heatmap_。形状[0]-1,2:带边框的heatmap_。形状[1]]
heatmap\u right=带边框的热图[1:带边框的热图。形状[0]-1,0:带边框的热图。形状[1]-2]
heatmap\u up=带边界的heatmap\u[2:带边界的heatmap\u.形状[0],1:带边界的heatmap\u.形状[1]-1]
heatmap_down=带边框的热图[0:带边框的热图。形状[0]-2,1:带边框的热图。形状[1]-1]
热图峰值=(热图中心>热图左侧)&\
(热图中心>热图右侧)&\
(热图中心>热图向上)&\
(热图中心>热图向下)
heatmap\u peaks=heatmap\u peaks[1:heatmap\u center.形状[0]-1,1:heatmap\u center.形状[1]-1]
keypoints=list(zip(np.nonzero(热图峰值)[1],np.nonzero(热图峰值)[0]))#(w,h)
keypoints=sorted(keypoints,key=itemgetter(0))
抑制=np.零(len(关键点),np.uint8)
关键点,带有分数和id=[]
keypoint_num=0
对于范围内的i(len(关键点)):
如果抑制[i]:
持续
对于范围内的j(i+1,len(关键点)):
如果math.sqrt((关键点[i][0]-关键点[j][0])**2+
(关键点[i][1]-关键点[j][1])**2)<6:
抑制[j]=1
keypoint_,带有_分数_和_id=(keypoints[i][0]、keypoints[i][1]、热图[keypoints[i][1]、keypoints[i][0],
总关键点数量+关键点数量)
带有分数和id的关键点。追加(带有分数和id的关键点)
keypoint_num+=1
所有关键点。追加(带有分数和id的关键点)
返回关键点\u num
我刚刚开始C#版本,现在不关注np.pad位

private static int extractKeypoints(NDArray heatmap, List<float> all_keypoints_by_num, int total_keypoints_num)
        {
            for (int i = 0; i < heatmap.size; i++)
            {
                if (heatmap[i] < 0.1)
                    heatmap[i] = 0;
            }

        }
private static int extractKeypoints(NDArray热图,按数量列出所有关键点,int total关键点数量)
{
对于(int i=0;i
np.pad似乎在整个热图周围添加了一个2像素的边框。因此,如果热图是124x124,结果将是128x128热图

现在让我们简化一下

heatmap_center = heatmap_with_borders[1:heatmap_with_borders.shape[0]-1, 1:heatmap_with_borders.shape[1]-1]
我们先从

heatmap_with_borders[1:heatmap_with_borders.shape[0]-1
1:带边框的热图。形状[0]-1
表示将项目从1拉至尺寸-1的大小

在我们的128128示例中,维度将是128,因此我们说:从1到127

如此具体地简化

heatmap_center = heatmap_with_borders[1:127, 1:127]
因此,您只需跳过2像素边框的外部1像素。在C#中,没有本机的“pull-part-of-the-list”语法,因此需要一个类似

getSublist(heatmap, start1, end1, start2, end2)
所以你的电话看起来像

heatmap_center = getSublist(heatmap, 1, heatmap.Length - 1, 1, heatmap[0].Length -1)

我的建议是,如果你关心C#为了自己实现它,为了在C#中舒适地使用它,那么如果速度太慢,就找一个具有类似功能的库。

至于你的具体问题“在下面的片段中,使用#u borders变量的热图的目的是什么?”


它似乎增加了一个2像素的边框。该算法似乎可以根据相邻像素生成某种热图。假设它需要1个像素的偏移裁剪,然后看哪个更大,中心还是1个像素的裁剪。因此,边界用于“填充”热图,以保持所有轻微的“作物”大小和边界相同。

解决方案:1。找出什么是np.pad(快速谷歌“np.pad”-numpy的一部分)2。搜索具有相同功能的C#库3。使用它。。。编辑:等等
NDArray
似乎来自此库。。。那么问题出在哪里呢?我不需要np.pad的帮助。这就是热图中心的定义。谢谢。真的很有帮助。我陷入了困境,基本上是想让这个项目在C#land工作:@Irwin是的,我不知道你已经是C#dev了,所以我相信你在实施这个项目时不会有问题。这是一个很好的例子,说明了为什么python在这类工作中如此流行。基本上,如果您想知道在python中做这样的事情是否值得,请只看这个示例。如果这些列表没有给您留下深刻印象,那么您会发现python中几乎没有其他东西值得切换。。