23

Python では、多次元配列の次元を返す関数を作成することは可能ですか (配列の次元がギザギザでないことを前提としています)?

たとえば、 の寸法は に[[2,3], [4,2], [3,2]]なりますが[3, 2]、 の寸法は に[[[3,2], [4,5]],[[3,4],[2,3]]]なります[2,2,2]

Python には、多次元配列のすべての次元を返す組み込み関数がありますか? または、この関数を自分で実装する必要がありますか?

4

5 に答える 5

36

いいえ、何も組み込まれていません。なぜなら、そのような「配列」ではギザギザになる可能性があり、「次元」または「形状」の概念はまったく意味をなさないからです。したがって、自分で作成する必要があります。すべての次元で均一性を仮定できる場合は、次のように進めることができます。

dim1 = len(a)
dim2 = len(a[0])
dim3 = len(a[0][0])
.
.
.

すべての次元を処理するためにこれを再帰的にするのはかなり簡単です。これはそれを行う必要があります:

def dim(a):
    if not type(a) == list:
        return []
    return [len(a)] + dim(a[0])

しかし、このようなものが必要な場合は、探しているものを提供するNumPy配列を検討することを検討numpy.ndarray.shapeしてください。

from numpy import array
l = [[2, 3], [4, 2], [3, 2]]
a = array(l)
print a.shape

出力

(3, 2)

1あなたは実際には配列を見ているのではなく、リスト、またはリストのリスト、またはリストのリストのリストを見ているので、恐怖の引用符で....

于 2013-07-08T16:44:00.623 に答える
16

あなたはnumpyでそれを行うことができます:

import numpy
l = [[2,3], [4,2], [3,2]]
m = numpy.array(l)
print m.shape

しかし、あなたの質問を誤解していない限り、2番目の例の形状は[1,4,5]ではなく[2,2,2]です...

于 2013-07-08T16:44:40.567 に答える
6

それは多次元配列ではありません。ですlist。たまたま他のリストが含まれています。あなたのリストが次のようになるはずがないと言うことは何もありません:

[[2,3], [4,2], [3,2,4,5,6]]

その場合、そのような関数が返す値は何だと思いますか?

特にPython自体が行列/配列クラスを定義していないため、あなたが求めることを行う一般的な関数はありません。リストの均一性に関して仮定を立てたり、アサーションを書いたりする準備ができていれば、リストやタプルのような反復可能なオブジェクトを操作する独自の関数を書くことができます。len(a)最初の次元、 2 番目の次元などに使用len(a[0])します。ここでは再帰があなたの味方になります。

正直なところ、行列にnumpy配列を使用した場合、これは非常に理にかなっていますが、関数は存在し(shapendarrayクラスのプロパティです)、意味があります。

于 2013-07-08T16:43:56.013 に答える
4

入力配列がギザギザではないと仮定すると、次のようになります。

def arr_dimen(a):
  return [len(a)]+arr_dimen(a[0]) if(type(a) == list) else []
于 2013-07-08T16:52:39.420 に答える