使用元组/列表作为数组索引(Python)

8
假设我在 Python 中有一个由列表嵌套表示的 n 维矩阵。我想能够使用 n 元组来索引矩阵。这种操作是否可行?如何实现?
谢谢!

1
如果你把它看作是一个矩阵,你可能会想使用numpy。 - roippi
@roippi:你说得对,我确实这样做了。 - Hee
5个回答

8

使用

>>> matrix = [[1, 2, 3], [4, 5, 6]]

你可以做以下事情:

>>> array_ = numpy.asarray(matrix)
>>> array_[(1,2)]
6

或者不使用numpy:

>>> position = (1,2)
>>> matrix[position[0]][position[1]]
6

当处理矩阵时,使用NumPy确实是最好的选择。 - Lynn

4

以下是一种方法:

matrx = [ [1,2,3], [4,5,6] ]

def LookupByTuple(tupl):
    answer = matrx
    for i in tupl:
        answer = answer[i]
    return answer

print LookupByTuple( (1,2) )

7
使用 *tupl 在 "def" 行中,你可以直接使用 1, 2 调用,即 print LookupByTuple(1, 2)。其作用是将传入的参数打包成一个元组(tuple),并在函数内部解包使用。 - H.D.

3

为了娱乐:

>>> get = lambda i,m: m if not i else get(i[1:], m[i[0]])

>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> idx = (1,2)
>>> get(idx, matrix)
6

2
是的。
>>> from functools import reduce # Needed in Python 3
>>>
>>> # A 3D matrix
>>> m = [
...       [
...         [1, 2, 3],
...         [4, 5, 6]
...       ],
...       [
...         [-1, -2, -3],
...         [-4, -5, -6]
...       ]
...     ]
>>>
>>> m[0][1][2]
6
>>> tuple_idx = (0, 1, 2)
>>> reduce(lambda mat, idx: mat[idx], tuple_idx, m)
6

或者你可以创建一个名为 Matrix 的类,在其中有一个 __getitem__ 方法(假设列表的列表在 self.data 内):

class Matrix(object):
    # ... many other things here ...
    def __getitem__(self, *args):
        return reduce(lambda mat, idx: mat[idx], args, self.data)

使用该方法,如果minstance是矩阵实例,您可以使用minstance [0, 1, 2]Numpyndarray已经有类似的功能,但允许切片和赋值。

0
如果您的代码保证元组中的每个索引对应于矩阵中不同的“级别”,那么您可以直接索引每个子列表。
indices = (12, 500, 60, 54)
val =  matrixes[indices[0]][indices[1]][indices[2]][indices[3]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接