迭代时如何获得2D Numpy数组中的位置?

2024-10-01 17:38:47 发布

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

我有一个2D Numpy数组,表示我正在用Python制作的基于平铺的游戏中的一个关卡地图。我的数组是50行x50列,每个值都是一个整数,表示精灵类型(各种墙部件、楼板等)。当我遍历数组并找到一个墙精灵(例如)时,我想知道该值的行数和列数,以便直接引用它

这似乎是一件简单的事情,但我似乎找不到正确的Numpy函数来遍历2D数组并返回它找到的每个数组的位置[row, col]。然后,我可以使用数组位置计算它在屏幕上的相对位置,然后测试与.colliderect()的冲突

编辑:为了更清楚,我添加了一个事实,即我需要将数组中的每个整数值与List个墙部分(也是整数)进行比较,如果它在列表中,则返回数组位置

TL;DR如何遍历Numpy数组并为每个匹配返回[row, col]而不是值


Tags: numpy游戏类型部件地图col整数数组
2条回答

我认为可以使用嵌套for循环和如下所示的数据结构:

假设map是一个二维numpy数组,1表示墙类型,2表示楼板类型

代码:

locationsToSprites = dict()#Data structure that stores the locations of the sprite type. 
for row in range(0, len(map)): #looping through all rows
    for col in range(0, len(map[row])):#looping through all columns of a row
        if(map[row][col] == 1):
            locationsToSprites[(row, col)] = 'the wall type'
        elif(map[row][col] == 2):
            locationsToSprites[(row, col)] = 'the floor type'

现在,因为使用字典存储精灵的位置,所以我们只需打印字典的键即可获得所有位置

只需使用np.argwhere

例如:

>>> import numpy as np
>>> a = np.zeros((50, 50))
>>> a[3, 4] = 1
>>> a[4, 5] = 1
>>> for i, j in np.argwhere(a == 1): print(i, j)
... 
(3, 4)
(4, 5)

(上面的示例是使用python 2运行的,因此显示了输出中的元组,但在其他方面与python 3中完全相同。)

相关问题 更多 >

    热门问题