web-dev-qa-db-ja.com

多次元の次元を見つけるPython array

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

たとえば、[[2,3], [4,2], [3,2]]のディメンションは[3, 2]になりますが、[[[3,2], [4,5]],[[3,4],[2,3]]]のディメンションは[2,2,2]になります。

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

13
Anderson Green

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

_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.ndarray.shape_ を含む NumPy 配列を確認することを検討してください。あなたが探しているものをあなたに与えます。

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

出力

_(3, 2)
_

1 あなたが本当に配列を見ていないので、恐ろしい引用符で、あなたはリスト、またはリストのリスト、またはリストのリストのリストを見ています...

25
jason

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

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

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

12
Ben

これは多次元配列ではありません。 listです。たまたま他のリストが含まれています。あなたのリストができなかったことは言うまでもありません:

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

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

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

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

5
David Heffernan

入力配列がギザギザではないと仮定:

def arr_dimen(a):
  return [len(a)]+arr_dimen(a[0]) if(type(a) == list) else []
3
Archit Jain