2016-11-17 22 views
-1

ナンシーでは、行列は単純に数字に限定されないもののネストされたリストになる可能性があります。たとえば、不規則なナンシー行列

import numpy as np 

a = [[1,2,5],[3,'r']] 
b = np.matrix(a) 

は苦情を提起しません。

リストが厳密な数学的意味で行列ではないオブジェクトを扱うことができる場合、この許容誤差の目的は何ですか?

+0

ねえ、downvoteの理由を明記してください。 – Hans

+0

一般的なオブジェクト(文字列やもっと一般的なものなど)を保存したいことがあるからです。それは単に数学的行列操作に使用されるだけではありません。 – sascha

+0

@サスカ:私の疑問は、これらの状況は、一般的なPythonのリストですでに処理できることです。ナンシーで別の治療法が必要なのはなぜですか?たとえば、行列演算が関数の行列に拡張されている場合、目的を理解することができます。しかし、私はナンシーがそのような機能を扱うとは思わない。 – Hans

答えて

1

あなたが作成したことは、オブジェクトDTYPE配列である:この配列の

In [302]: b=np.array([[1,2,5],[3,'r']]) 
In [303]: b 
Out[303]: array([[1, 2, 5], [3, 'r']], dtype=object) 
In [304]: b.shape 
Out[304]: (2,) 
In [305]: b[0] 
Out[305]: [1, 2, 5] 
In [306]: b[1]=None 
In [307]: b 
Out[307]: array([[1, 2, 5], None], dtype=object) 

要素がポインタである - 他のメモリ内のオブジェクトへのポインタ。それは他の配列のようにデータバッファを持っています。この場合、2つのポインタ、2

In [308]: b.__array_interface__ 
Out[308]: 
{'data': (169809984, False), 
'descr': [('', '|O')], 
'shape': (2,), 
'strides': None, 
'typestr': '|O', 
'version': 3} 
In [309]: b.nbytes 
Out[309]: 8 
In [310]: b.itemsize 
Out[310]: 4 

これはリストに非常によく似ていて、オブジェクトポインタもバッファに格納されています。しかし、appendメソッドを持たない点で異なりますが、すべての配列が.reshapeのようになっています。

numpyは、このような配列をリストのように扱い、ポインタを繰り返し処理します。数値で動作する数学演算の多くは、オブジェクトdtypesで失敗します。

なぜこれを許可しますか?部分的には単純な数値と文字列のものを超えて要素値/ dtypesの概念を拡張した一般化です。 numpyはまた、化合物dtypes(構造化された配列)を可能にします。 MATLABはマトリックスクラスをcellsに拡張しました。これは似ています。

オブジェクト配列に関する多くの疑問があります。場合によってはエラーで生成されることもあります。Creating numpy array from list gives wrong shape

意図的に作成されることがあります。 pandasは、データ系列をオブジェクトdtypeに簡単に変更して、値の組み合わせ(文字列、nan、int)に対応します。

np.array()は可能な限り高い次元の配列を作成しようとします。たとえば、サブリストの長さが異なる場合など、できない場合にのみオブジェクトdtypeを使用します。実際には、サブリストがすべて同じ場合に、オブジェクト配列を作成するための特別な構築メソッドに頼る必要があります。

これはまだオブジェクトの配列ですが、次元が高いです:

In [316]: np.array([[1,2,5],[3,'r',None]]) 
Out[316]: 
array([[1, 2, 5], 
     [3, 'r', None]], dtype=object) 
In [317]: _.shape 
Out[317]: (2, 3) 
+0

ニース。 '' '__array_interface__'''を見たことはありません。また、良いと明確な説明。 – sascha

関連する問題