我在Python中创建了一个多维数组,如下所示:
self.cells = np.empty((r,c),dtype=np.object)
现在我想迭代我的二维数组的所有元素,我不关心顺序。我如何实现这一目标?
答案 0 :(得分:39)
很明显你正在使用numpy。有了numpy,你可以这样做:
for cell in self.cells.flat:
do_somethin(cell)
答案 1 :(得分:28)
如果您需要更改单个单元格的值,则ndenumerate(numpy)是您的朋友。即使你不这样做,它可能仍然是!
for index,value in ndenumerate( self.cells ):
do_something( value )
self.cells[index] = new_value
答案 2 :(得分:13)
只需迭代一个维度,然后迭代另一个维度。
for row in self.cells:
for cell in row:
do_something(cell)
当然,只有两个维度,您可以使用list comprehension或生成器表达式将其压缩为单个循环,但这不是非常可扩展或可读:
for cell in (cell for row in self.cells for cell in row):
do_something(cell)
如果您需要将此缩放到多个维度并且确实需要平面列表,则可以write a flatten
function。
答案 3 :(得分:6)
这个怎么样:
import itertools
for cell in itertools.chain(*self.cells):
cell.drawCell(surface, posx, posy)
答案 4 :(得分:6)
您可以使用enumerate命令获取每个元素的索引以及元素本身:
for (i,row) in enumerate(cells):
for (j,value) in enumerate(row):
print i,j,value
i
,j
包含元素的行和列索引,value
是元素本身。
答案 5 :(得分:3)
没有人会有一个任意多个维度的答案,没有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
# ..
这并没有很好的错误检查,但它适用于我
答案 6 :(得分: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]))