37

我在 Python 中创建了一个多维数组,如下所示:

self.cells = np.empty((r,c),dtype=np.object)

现在我想遍历我的二维数组的所有元素,我不关心顺序。我如何实现这一目标?

4

7 回答 7

50

很明显,您正在使用 numpy. 使用 numpy 你可以这样做:

for cell in self.cells.flat:
    do_somethin(cell)
于 2009-06-09T18:34:53.443 回答
30

如果您需要更改单个单元格的值,那么 ndenumerate(在 numpy 中)是您的朋友。即使你不这样做,它可能仍然是!

for index,value in ndenumerate( self.cells ):
    do_something( value )
    self.cells[index] = new_value
于 2011-01-06T08:56:36.303 回答
18

只需迭代一个维度,然后是另一个。

for row in self.cells:
    for cell in row:
        do_something(cell)

当然,只有两个维度,您可以使用列表理解或生成器表达式将其压缩为单个循环,但这不是非常可扩展或可读性:

for cell in (cell for row in self.cells for cell in row):
    do_something(cell)

如果您需要将其扩展到多个维度并且真的想要一个平面列表,您可以编写一个flatten函数

于 2009-06-09T18:29:32.547 回答
8

您可以使用 enumerate 命令获取每个元素的索引以及元素本身:

for (i,row) in enumerate(cells):
  for (j,value) in enumerate(row):
    print i,j,value

i,j包含元素的行和列索引并且value是元素本身。

于 2015-11-23T04:18:17.917 回答
6

这个怎么样:

import itertools
for cell in itertools.chain(*self.cells):
    cell.drawCell(surface, posx, posy)
于 2009-06-09T18:35:06.797 回答
5

没有人有一个答案可以在没有 numpy 的情况下从任意多个维度起作用,所以我将在这里放一个我使用过的递归解决方案

def iterThrough(lists):
  if not hasattr(lists[0], '__iter__'):
    for val in lists:
      yield val
  else:
    for l in lists:
      for val in iterThrough(l):
        yield val

for val in iterThrough(
  [[[111,112,113],[121,122,123],[131,132,133]],
   [[211,212,213],[221,222,223],[231,232,233]],
   [[311,312,313],[321,322,323],[331,332,333]]]):
  print(val)
  # 111
  # 112
  # 113
  # 121
  # ..

这没有很好的错误检查,但它对我有用

于 2016-02-06T22:12:58.847 回答
1

可能还值得一提itertools.product()

cells = [[x*y for y in range(5)] for x in range(10)]
for x,y in itertools.product(range(10), range(5)):
    print("(%d, %d) %d" % (x,y,cells[x][y]))

它可以创建任意数量的迭代的笛卡尔积:

cells = [[[x*y*z for z in range(3)] for y in range(5)] for x in range(10)]
for x,y,z in itertools.product(range(10), range(5), range(3)):
    print("(%d, %d, %d) %d" % (x,y,z,cells[x][y][z]))
于 2018-10-11T10:11:00.740 回答