一般に、2 次元のデータ構造がある場合、それは 2 つのコンテナー (リストのリストまたは辞書の辞書) の組み合わせです。単一のコレクションを作成したいが、それを 2 次元で操作したい場合はどうすればよいでしょうか?
それ以外の:
collection[y][x]
行う:
collection[x,y]
PIL
Image.load
関数はこのように機能するオブジェクトを返すため、それが可能であることはわかっています。
一般に、2 次元のデータ構造がある場合、それは 2 つのコンテナー (リストのリストまたは辞書の辞書) の組み合わせです。単一のコレクションを作成したいが、それを 2 次元で操作したい場合はどうすればよいでしょうか?
それ以外の:
collection[y][x]
行う:
collection[x,y]
PIL
Image.load
関数はこのように機能するオブジェクトを返すため、それが可能であることはわかっています。
重要なのは、Python がどのようにインデックスを作成するかを理解することです。__getitem__
角かっこでインデックスを作成しようとすると、Python はオブジェクトのメソッドを呼び出します[]
。私を正しい方向に向けてくれたこの回答に感謝します:角括弧でアクセスできるPythonオブジェクトを作成してください
角かっこでインデックスのペアを使用すると__getitem__
、パラメーターのタプルを使用してメソッドが呼び出されkey
ます。
これは、2 次元のインデックスが与えられたときに、整数のインデックスを 1 次元のリストに単純に返す単純なデモ クラスです。
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
container[index_1, index_2]
これは、私が表記法に適合させたpythonメーリングリストで提案された別のアプローチです。
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