2009-04-04 10 views
4

昨日私はPythonで行列型が必要でした。Pythonの行列

明らかに、この必要性に対する些細な答えはnumpy.matrix()ですが、追加の問題は、リストと同様に、混合型の任意の値を格納する行列が欲しいということです。 numpy.matrixはこれを実行しません。例では、あなたが見ることができるように、numpy.matrixはコンテンツで均質でなければならない

>>> numpy.matrix([[1,2,3],[4,"5",6]]) 
matrix([['1', '2', '3'], 
     ['4', '5', '6']], 
     dtype='|S4') 
>>> numpy.matrix([[1,2,3],[4,5,6]]) 
matrix([[1, 2, 3], 
     [4, 5, 6]]) 

です。私の初期化で文字列値が存在する場合、すべての値は暗黙的に文字列として格納されます。これは、単一の値にアクセスすることによっても確認されます。

>>> numpy.matrix([[1,2,3],[4,"5",6]])[1,1] 
'5' 
>>> numpy.matrix([[1,2,3],[4,"5",6]])[1,2] 
'6' 

ここで、Pythonリスト型は、代わりに混合型を受け入れることができます。整数と文字列を含むリストを持つことができ、両方とも型を保存します。私が必要とするものはリストに似ていますが、マトリックスのような振る舞いで動作します。

したがって、自分のタイプを実装する必要がありました。内部実装には、リストを含むリストと辞書という2つの選択肢がありました。両方の解決法には欠点があります。

  • リストにはさまざまなリストのサイズを注意深く同期させる必要があります。 2行をスワップするのは簡単です。 2つの列を交換するのは簡単ではありません。行の削除も簡単です。
  • 辞書(タプルをキーとする)はやや優れていますが、キーの制限を定義する必要があります(たとえば、行列が3x3の場合は要素5,5を挿入できません)。列または行の挿入、削除、またはスワップに使用します。

編集:明確化。なぜこの機能が必要なのかという具体的な理由は、私がCSVファイルを読んでいるからです。 CSVファイル(文字列、整数、浮動小数点数など)から値を収集したら、スワップ、削除、挿入などの操作を同じように実行したいと思います。このため、私は「マトリックスリスト」が必要です。

私の好奇心は、以下のとおりです。このサービスを提供するPythonのデータ型は、すでに(そこにライブラリを「非バッテリーが含まれている」多分に)存在する場合

  • は知っていますか?
  • このデータ型は標準ライブラリで提供されていないのはなぜですか?あまりにも制限された関心?
  • このニーズをどうやって解決しましたか?辞書、リスト、または他のスマートなソリューション?

答えて

10

あなたdtypeobjectある場合は、不均一な型を持つことができます。

In [1]: m = numpy.matrix([[1, 2, 3], [4, '5', 6]], dtype=numpy.object) 
In [2]: m 
Out[2]: 
matrix([[1, 2, 3], 
     [4, 5, 6]], dtype=object) 
In [3]: m[1, 1] 
Out[3]: '5' 
In [4]: m[1, 2] 
Out[4]: 6 

ドンが指摘したように、あなたが数学を行うことができない、ので、私は、これは空想のインデックスよりもあなたが他の何に良い見当がつかないこの行列。

5

なぜこの機能が必要なのか不思議です。私が理解しているように、(numpyで)行列を持つ理由は、主に線形数学(行列変換など)を行うためです。

10進数とストリングの積に何の数学的定義があるのか​​よくわかりません。

内部的には、疎な行列の実装(http://www.inf.ethz.ch/personal/arbenz/pycon03_contrib.pdf)を調べることをお勧めします。これを行う方法はたくさんあります(ハッシュ、リスト、リンクされたリスト)、それぞれには長所と短所があります。あなたの行列がヌルまたはゼロをたくさん持っていない場合は、スパースな実装を取り除くことができます。

+0

私はcsvファイルから読み込んだ任意の値を格納する必要があり、これらの値は文字列、浮動小数点数、または整数のいずれかになります。 csvモジュールでは、CSVファイルを1行ずつ読み込むことができますが、それを「行列」として格納するには、それは私の責任です。 –

+0

「マトリックス」はまったく記述されていません。あなたはタプルのリストを記述しています。 – kquinn

+0

はい、そうです。しかし、残念ながら、行列のスワップ、列の入れ替え、列の挿入/削除など、行列で行う操作と同様に、このタプルのリストに対して操作を実行できるようにしたいと考えています。 –

3

numpy.recarrayの機能はありますか?ここで例えば

: http://docs.scipy.org/doc/numpy/reference/generated/numpy.recarray.html

混合データ型を持つ配列を許可するように設計されています

配列があなたの目的に合っているか、実際に行列が必要なのかどうかわかりません - 私はnumpy行列を扱っていません。しかし、配列が十分あれば、再配列が機能するかもしれません。

+0

私は再配列を使って見ている唯一の問題(おそらく私は間違っている、彼らと実際の経験を持っていない)は、彼は簡単に列を交換することができないだろうということです。 – Autoplectic

+0

私は行と列を交換する必要があると言うでしょう、配列は正しいデータ構造ではなく単純です。お互いに独立している必要があります。 –

0

csvファイルをcsvファイルで使用すると考えましたか?

Python docs for csv module

+0

csvは、行単位でデータを提供し、レコードを文字列としてのみ返します。私はファイルを読むためにcsvを使用していますが、私は必要なtranformationsを実行するためにスマートなデータ型が必要です。 –

1

sympyをチェックアウト - それは、その行列に多型 でかなり良い仕事をして、あなたは、あなたはなどcol_swap、col_insert、col_del、などのsympy.matrices.Matrix オブジェクトに対する操作を持っています... pandasを使用しない理由

 
In [2]: import sympy as s 
In [6]: import numpy as np 

In [11]: npM = np.array([[1,2,3.0], [4,4,"abc"]], dtype=object) 
In [12]: npM 
Out[12]: 
[[1 2 3.0] 
[4 4 abc]] 

In [14]: type(npM[0][0]) 
Out[14]: 
In [15]: type(npM[0][2]) 
Out[15]: 
In [16]: type(npM[1][2]) 
Out[16]: 


In [17]: M = s.matrices.Matrix(npM) 
In [18]: M 
Out[18]: 
⎡1 2 3.0⎤ 
⎢   ⎥ 
⎣4 4 abc⎦ 


In [27]: type(M[0,2]) 
Out[27]: 
In [28]: type(M[1,2]) 
Out[28]: 

In [29]: sym= M[1,2] 
In [32]: print sym.name 
abc 

In [34]: sym.n 
Out[34]: 
In [40]: sym.n(subs={'abc':45}) 
Out[40]: 45.0000000000000 

1

多分それは 、 、後半の答えですが?