1

Python で 2D 配列のスライシングをどのように実装できるのだろうか?

例えば、

arr自己定義クラス 2D 配列のインスタンスです。

このオブジェクトで 2D スライシング構文を有効にしたい場合は、次のようにします。

arr[:,1:3] #retrieve the 1 and 2 column values of every row

また

arr[,:3] #retrieve the 1 and 2 column values of every row

使い方と構文は numpy.array と同じです。しかし、この種の機能を独自に実現するにはどうすればよいでしょうか。

PS:

私が考えていること:

最初のケースでは、[:,1:3]パーツは 2 つのスライスのタプルのようなものです

ただし、2 番目のケースについては、[,1:3]非常に謎に包まれているようです。

4

4 に答える 4

10

配列スライスのルールを知りたい場合は、次の図が役立ちます。

ここに画像の説明を入力

于 2013-04-19T03:59:55.180 に答える
2

obj[,:3]は有効な python ではないため、SyntaxError--が生成されます。したがって、ソース ファイルにその構文を含めることはできません。numpy(アレイでも使用しようとすると失敗します)

于 2013-04-19T03:39:30.030 に答える
0

これが独自のクラスであり、文字列を渡そうとする場合のハックです。

[] 演算子をオーバーライドするには?

class Array(object):

    def __init__(self, m, n):
        """Create junk demo array."""
        self.m = m
        self.n = n
        row = list(range(self.n))
        self.array = map(lambda x:row, range(self.m))

    def __getitem__(self, index_string):
        """Implement slicing/indexing."""

        row_index, _, col_index = index_string.partition(",")

        if row_index == '' or row_index==":":
            row_start = 0
            row_stop = self.m
        elif ':' in row_index:
            row_start, _, row_stop = row_index.partition(":")
            try:
                row_start = int(row_start)
                row_stop = int(row_stop)
            except ValueError:
                print "Bad Data"
        else:
            try:
                row_start = int(row_index)
                row_stop = int(row_index) + 1
            except ValueError:
                print "Bad Data"

        if col_index == '' or col_index == ":":
            col_start = 0
            col_stop = self.n
        elif ':' in col_index:
            col_start, _, col_stop = col_index.partition(":")
            try:
                col_start = int(col_start)
                col_stop = int(col_stop)
            except ValueError:
                print "Bad Data"
        else:
            try:
                col_start = int(col_index)
                col_stop = int(col_index) + 1
            except ValueError:
                print "Bad Data"

        return map(lambda x: self.array[x][col_start:col_stop],
                       range(row_start, row_stop))

    def __str__(self):
        return str(self.array)

    def __repr__(self):
        return str(self.array)


array = Array(4, 5)
print array
out: [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

array[",1:3"]
out: [[1, 2], [1, 2], [1, 2], [1, 2]]

array[":,1:3"]
out: [[1, 2], [1, 2], [1, 2], [1, 2]]
于 2013-04-19T05:54:04.397 に答える