6

昨日、Python で行列型が必要になりました。

どうやら、この必要性に対する簡単な答えは を使用すること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、コンテンツは均一でなければなりません。初期化に文字列値が存在する場合、すべての値が文字列として暗黙的に格納されます。これは、単一の値にアクセスすることによっても確認されます

>>> 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データ型がすでに存在するかどうか知っていますか(おそらく「バッテリーを含まない」ライブラリにあります)?
  • このデータ型が標準ライブラリで提供されていないのはなぜですか? 興味が制限されすぎているのでしょうか?
  • このニーズをどのように解決したでしょうか。辞書、リスト、または別のよりスマートなソリューションですか?
4

6 に答える 6

11

dtype次の場合は、不均一な型を使用できますobject

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

Don が指摘したように、この行列を使って計算を行うことはできないため、派手なインデックス作成以外にこれがどのような利点があるのか​​ わかりません。

于 2009-04-04T01:38:21.347 に答える
5

この機能が必要な理由が知りたいです。私が理解しているように、(numpyで)行列を使用する理由は、主に線形計算(行列変換など)を行うためです。

10 進数と文字列の積の数学的な定義がどうなるかはわかりません。

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

于 2009-04-04T01:27:36.567 に答える
3

numpy.recarray 機能を見たことがありますか?

たとえば、こちら: http://docs.scipy.org/doc/numpy/reference/generated/numpy.recarray.html

データ型が混在する配列を許可するように設計されています。

配列が目的に合っているかどうか、または本当にマトリックスが必要かどうかはわかりません-numpyマトリックスを扱ったことはありません。しかし、配列が十分に優れている場合は、rearray が機能する可能性があります。

于 2009-04-04T02:37:53.120 に答える
1

sympy をチェックしてください。マトリックスのポリモーフィズムが非常にうまく機能しており、col_swap、col_insert、col_del などの sympy.matrics.Matrix オブジェクトを操作できます。

[2]: sympy を s としてインポート
[6]: numpy を np としてインポート

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

[14]: type( npM[0][0] )
アウト[14]:
[15]: type( npM[0][2] )
アウト[15]:
[16]: type( npM[1][2] )
アウト[16]:


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


[27]: type( M[0,2] )
アウト[27]:
[28]: type( M[1,2] )
アウト[28]:

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

[34]: sym.n
アウト[34]:
[40]: sym.n(subs={'abc':45})
アウト[40]: 45.0000000000000

于 2011-03-20T20:28:20.750 に答える
0

csv ファイルを操作するための csv モジュールを検討しましたか?

csv モジュールの Python ドキュメント

于 2009-04-04T11:32:13.367 に答える