你如何在Python中进行二维(x,y)索引?

时间:2013-03-01 04:35:55

标签: python multidimensional-array indexing

通常,如果您有二维数据结构,则它是两个容器的组合 - 列表列表或字典字典。如果您想制作单个集合但在二维中进行操作会怎样?

而不是:

collection[y][x]

做的:

collection[x,y]

我知道这是可能的,因为PIL Image.load function会返回一个以这种方式工作的对象。

3 个答案:

答案 0 :(得分:5)

关键是要了解Python如何编制索引 - 当您尝试使用方括号__getitem__对其进行索引时,它会调用对象的[]方法。感谢这个答案指出我正确的方向:Create a python object that can be accessed with square brackets

在方括号中使用一对索引时,将使用__getitem__参数的元组调用key方法。

这是一个简单的演示类,当给定二维索引时,它只会将整数索引返回到一维列表。

class xy(object):

    def __init__(self, width):
        self._width = width

    def __getitem__(self, key):
        return key[1] * self._width + key[0]

>>> test = xy(100)
>>> test[1, 2]
201
>>> test[22, 33]
3322

还有一个伴随__setitem__方法,在方括号中分配索引时使用。

答案 1 :(得分:1)

使用numpy数组。

如果你有一个普通的Python数组,你可以将它变成一个numpy数组并访问它所描述的元素:

a = [[1,2,3],[4,5,6],[7,8,9]]
A = numpy.array(a)
print A[1,1]

将打印:

5

另一个例子:

A = numpy.zeros((3, 3))
for i in range(3):
    for j in range(3):
        A[i,j] = i*j
print A

会给你:

[[ 0.  0.  0.]
 [ 0.  1.  2.]
 [ 0.  2.  4.]]

答案 2 :(得分:0)

我找到了this recipe at the python mailing list。有了它,您可以使用索引迭代器访问容器的元素。如果您需要使用container[index_1, index_2]符号,可以使用Mark的帖子概述的方法轻松调整。

>>> from operator import getitem
>>> from functools import reduce
>>> l = [1,[2,[3,4]]]
>>> print(reduce(getitem, [1,1,1], l))
 4

这是python邮件列表中建议的一种不同的方法,我采用了container[index_1, index_2]符号。

class FlatIndex(object):
  def __init__(self, l):
    self.l = l
  def __getitem__(self, key):
    def nested(l, indexes):
      if len(indexes) == 1:
        return l[indexes[0]]
      else:
        return nested(l[indexes[0]], indexes[1:])
    return nested(self.l, key)

>>> l = [1,[2,[3,4,[5,6]]]] 
>>> a = FlatIndex(l)
>>> print(a[1,1,2,1])
 6