簡體   English   中英

如何在Python中進行二維(x,y)索引?

[英]How do you do two dimensional (x,y) indexing in Python?

通常,如果您具有二維數據結構,則它是兩個容器的組合-列表列表或字典詞典。 如果您想制作一個單一的收藏但要在兩個維度上工作,該怎么辦?

代替:

collection[y][x]

做:

collection[x,y]

我知道這是有可能的,因為PIL Image.load函數返回一個以這種方式工作的對象。

關鍵是要了解Python是如何進行索引的-當您嘗試使用方括號[]對其進行索引時,它將調用對象的__getitem__方法。 感謝此答案為我指出了正確的方向: 創建一個可以用方括號訪問的python對象

當您在方括號中使用一對索引時,將使用__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__方法。

使用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.]]

在python郵件列表中找到了這個食譜 使用它,您可以使用索引迭代器訪問容器的元素。 如果您需要使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM