Python 迭代时如何获得2D Numpy数组中的位置?
我用PythonPython 迭代时如何获得2D Numpy数组中的位置?,python,arrays,python-3.x,numpy,numpy-ndarray,Python,Arrays,Python 3.x,Numpy,Numpy Ndarray,我用Python3.7制作了一个2D Numpy数组,它代表了一个基于平铺的游戏中的关卡地图。我的数组是50行x50列,每个值都是一个整数,表示精灵类型(各种墙部件、楼板等)。当我遍历数组并找到一个墙精灵(例如)时,我想知道该值的行数和列数,以便直接引用它 这似乎很简单,但我似乎找不到正确的Numpy函数,该函数将遍历2D数组并返回它找到的每个数组的位置[row,col]。然后,我可以使用数组位置计算它在屏幕上的相对位置,然后使用.collide rect()测试碰撞 编辑:为了更清楚,我添加了
3.7
制作了一个2D Numpy数组,它代表了一个基于平铺的游戏中的关卡地图。我的数组是50行x50列,每个值都是一个整数,表示精灵类型(各种墙部件、楼板等)。当我遍历数组并找到一个墙精灵(例如)时,我想知道该值的行数和列数,以便直接引用它
这似乎很简单,但我似乎找不到正确的Numpy函数,该函数将遍历2D数组并返回它找到的每个数组的位置[row,col]
。然后,我可以使用数组位置计算它在屏幕上的相对位置,然后使用.collide rect()
测试碰撞
编辑:为了更清楚,我添加了一个事实,即我需要将数组中的每个整数值与墙零件(也是整数)的列表进行比较,如果它在列表中,则返回数组位置
TL;DR如何迭代Numpy 2DARRY,并为每个匹配返回[行,列]
,而不是值?我认为可以使用嵌套for循环和如下数据结构:
假设map是一个二维numpy数组,1表示墙类型,2表示楼板类型
代码:
现在,由于使用字典存储精灵的位置,我们只需打印字典的键即可获得所有位置。只需使用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完全相同。)通常,您只需使用布尔表达式array==4
,例如,将给出一个50x50
矩阵,其中包含true或false,我认为,如果布尔数组不能满足您的任何需要,就需要获取索引。我不可能告诉你如何使用它,但是numpy把我搞糊涂了:)考虑用列表代替。标准pythonenumerate
提供了索引和值。我可能应该提到我最初是用于循环的标准,但当我听说Numpy数组使用起来更快时,我将我的列表数组切换为Numpy数组,现在我正在寻找使用Numpy进行迭代的更快方法,但看起来标准迭代可能是最终的解决方法。我正试图让它与我的程序一起工作,但现在的问题是,因为我有许多墙类型,.argwhere
方法不喜欢我这样编写它:对于行,列在np.argwhere中(level\u map.data in level\u map.wall\u types):
这是因为我正在将它与列表(墙类型)进行比较吗?如果我使用.argwhere(level\u map.data==1),它会起作用。
但我如何将其应用于一组墙类型?我得到一个错误:包含多个元素的数组的真值不明确。使用a.any()或a.all()
但我不确定如何使用?
>>> 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)