Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代时如何获得2D Numpy数组中的位置?_Python_Arrays_Python 3.x_Numpy_Numpy Ndarray - Fatal编程技术网

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

Python 迭代时如何获得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()测试碰撞 编辑:为了更清楚,我添加了

我用Python
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把我搞糊涂了:)考虑用列表代替。标准python
enumerate
提供了索引和值。我可能应该提到我最初是用于循环的标准,但当我听说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)