【问题标题】:How do I get the position in a 2D Numpy array when iterating?迭代时如何获得二维 Numpy 数组中的位置?
【发布时间】:2020-11-09 03:33:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 好吧,通常你只会使用布尔表达式 array == 4 例如会给出一个 50x50 矩阵与真或假,我认为 numpy.where 在布尔数组不起作用时获取索引满足您的任何需求。我不可能告诉你如何使用它,numpy 让我很困惑 :)
  • 考虑改用列表列表。标准 python enumerate 给出索引和值。

标签: python arrays python-3.x numpy numpy-ndarray


【解决方案1】:

只需使用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 完全相同。)

【讨论】:

  • 我正试图让它与我的程序一起工作,但现在的问题是因为我有很多墙类型,.argwhere 方法不喜欢我这样写:for row, col in np.argwhere(level_map.data in level_map.WALL_TYPES): 是不是因为我将它与列表(WALL_TYPES)进行比较?
  • 如果我使用.argwhere(level_map.data == 1),它可以工作,但我如何将它应用于一堆墙类型?我收到一个错误:The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(),但我不确定如何?
【解决方案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'

现在,由于使用了字典来存储精灵的位置,我们只需打印字典的键即可获取所有位置。

【讨论】:

  • 我可能应该提到我最初使用的是标准 For 循环,但是当我听说 Numpy 数组使用起来更快时,我将我的 List 数组切换为 Numpy 数组,我现在正在寻找使用 Numpy 进行迭代的更快方法,但看起来标准迭代毕竟可能是要走的路。
猜你喜欢
  • 2011-12-28
  • 1970-01-01
  • 2014-01-31
  • 2012-11-06
  • 2018-12-01
  • 1970-01-01
  • 2020-10-06
  • 2016-01-28
  • 1970-01-01
相关资源
最近更新 更多