使用list tuple作为2d索引来循环遍历另一个2d列表

时间:2014-02-24 08:09:42

标签: python multidimensional-array

我建立了一个这样的列表:

num_rows和num cols来自列表aaa

for i in range(num_rows):
     for j in range(num_cols):
         if (aaa[i][j] == 0):
               bbb.append((i,j))
     pass
pass

现在我有另一个名为ccc with with floats的2d列表。我想使用bbb中的元组作为ccc的索引(特定的行和col)。我需要在特定索引之后做一个np.sum。所以我尝试过这样的事情:

np.sum(ccc[k][l] for (k,l) in bbb)

我是python的新手,我知道这不对。我几乎没有学会如何编写循环...但有没有办法做这样的事情?

谢谢大家。

2 个答案:

答案 0 :(得分:0)

使用常规sumnp.sum需要一个类似数组的对象:

sum(ccc[k][l] for (k,l) in bbb)

请注意,如果您使用的是NumPy,则可能不应该使用所有这些列表和非NumPy操作。以下是使用aaaccc作为NumPy数组的代码:

ccc[aaa==0].sum()

代码少得多,运行速度比基于列表的解决方案快得多。

附加说明:您无需使用pass结束循环。

答案 1 :(得分:0)

如果aaaccc都是numpy数组,请使用np.sum(ccc[aaa == 0])

>>> import numpy as np
>>>
>>> aaa = np.array([
...     [1, 0, 1],
...     [0, 1, 0],
...     [1, 0, 1],
... ])
>>> ccc = np.array([
...     [1, 2, 3],
...     [4, 5, 6],
...     [7, 8, 9],
... ])

>>> aaa == 0
array([[False,  True, False],
       [ True, False,  True],
       [False,  True, False]], dtype=bool)

>>> ccc[aaa == 0]
array([2, 4, 6, 8])

>>> np.sum(ccc[aaa == 0])
20