Python:二维阵列中的定向导航

2024-10-02 00:24:29 发布

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

TLDR:我想从中心开始在2D数组中导航所有方向

我尝试在2dpython数组中执行特定的导航。假设我有这个2D数组(A1):

enter image description here

我想在这个数组中导航,并对A1*A2的索引应用索引求和,其中A2是另一个2D数组(A2):

enter image description here

当应用求和时,我希望当前索引从第二个2D数组的中心开始。所以在A1[0][0](1)处,我想用A2(A21,或0)的中心。然后,我要移动第二个数组中的每个项目并继续此过程:

1(0)+2(1)+5(2)+6(1)

这将处理A2[中心x][中心y]中的所有项目。然后,我想双倍返回,并添加所有低于中心的值。下面是一张说明我要做什么的快速图像,其中一张显示了我们出界的情况,以及在边界上的情况:

enter image description here

我要做的是编写一个函数,它将从二维数组的中心向该二维数组的每个方向导航。下面是我的代码:

for row in range(A1.length):
    for column in range(A1[0].length):
        cRow = 0
        pSum = 0
        kRow = midRow - 1
        while kRow < A2.length and row + kRow < A1.length:
            kColumn = midColumn - 1
            cColumn = 0
            while kColumn < A2[0].length and column + kColumn < A1[0].length:
                pSum += float(A1[row + cRow][column + cColumn] * A2[kRow][kColumn])
                kColumn += 1
                cColumn += 1
            kRow += 1
            cRow += 1

        nKRow = midRow - 1
        cRow = 0
        #Get rows past
        while nKRow >= 0 and row - nKRow >= 0:
            nKColumn = midColumn - 1
            cColumn = 0
            while nKColumn >= 0 and column - nKColumn >= 0:
                # Account for row 0
                if row == 1 and cColumn == 0:
                    pSum += float(A1[0][column - cColumn] * A2[nKRow][nKColumn])
                else:
                    pSum += float(A1[row - cRow][column - cColumn] * A2[nKRow][nKColumn])
                nKColumn -= 1
                cColumn += 1
            nKRow -= 1
            cRow += 1


        value = float(pSum / average)
        A3[row][column] = value

这在大多数情况下有效,但在边缘情况下不正确。问题是当row=0或column=0时,我在设置值时遇到问题。在

是否有更好的方法从中心开始在二维阵列中导航每个方向?


Tags: anda2a1column数组中心lengthrow
1条回答
网友
1楼 · 发布于 2024-10-02 00:24:29

{是的,看起来像是}?在

在您的示例中,midRow、midColumn和average在哪里定义?在

为什么要从A2的中心开始?求和和和和乘法都是交换运算,所以顺序不重要。从A2的左上角开始会简单得多。比如(我还没有测试过):

kernelSize = 3
kernelOffset = int(kernelSize / 2) # Assumes only odd-sized kernels
for x in xrange(len(A1)):
    for y in xrange(len(A1[0])):
        total = 0
        for kx in xrange(kernelSize):
            for ky in xrange(kernelSize):
                offsetX = -kernelOffset + kx # Should give something in the range [-1, 1]
                offsetY = -kernelOffset + ky
                currentX = x + offsetX
                currentY = y + offsetY
                if currentX < 0 or currentX >= len(A1) or currentY < 0 or currentY >= len(A1[0]): # do nothing if "out of bounds"
                    continue
                total += A1[currentX][currentY] * A2[kx][ky]
        A3[x][y] = total

相关问题 更多 >

    热门问题