web-dev-qa-db-ja.com

派手な行列の行を反復する

最初に、Googleとサイトで検索している私の質問(かなり基本的だと思う)に対する回答を見つけようとしましたが、何も見つかりませんでした。

派手な行列から行を取得しようとしていますが、できません。たとえば、私がこれを使用する場合:

_result = numpy.matrix([[11, 12, 13],
                       [21, 22, 23],
                       [31, 32, 33]])

for p in result:
    print(p[0])
_

これを印刷します:

_[[11 12 13]]
[[21 22 23]]
[[31 32 33]]
_

pだけを使用しても同じです

すべての行にアクセスするにはどうすればよいですか? numpy.nditer(result)は配列を出力します。いくつかの操作を実行するには、すべての行が必要です。

4
exsnake

問題は、np.matrixを使用していることです。代わりにnp.arrayを使用し、インデックスを作成せずに単に繰り返します。

result = np.array([[11, 12, 13],
                   [21, 22, 23],
                   [31, 32, 33]])

for p in result:
    print(p)

[11 12 13]
[21 22 23]
[31 32 33]

説明

あなたが見ているのは、それぞれのrowが2つの次元を持つことを要求するnumpy.matrixの効果です。これは不要で、NumPyのアンチパターンです。

numpy.matrixの背景には歴史があります。これは、行列乗算演算子の便宜のために最初に使用されました。しかし、ネストされたdot呼び出しの代わりに@を使用できるため(Python 3.5以降)、これは問題ではなくなりました。したがって、デフォルトではnumpy.arrayを使用します。

7
jpp

2つの方法があります(どちらも基本的に同じロジックに要約されます)

方法1:

_result.A_ を使用します

selfndarrayオブジェクトとして返します。
np.asarray(self)と同等です。

_In [16]: for row in result.A:
    ...:     print(row)
    ...:     
[11 12 13]
[21 22 23]
[31 32 33]
_

方法2:

result.getA() を使用します

selfndarrayオブジェクトとして返します。
np.asarray(self)と同等です。

_In [17]: for row in result.getA():
    ...:     print(row)
    ...:     
[11 12 13]
[21 22 23]
[31 32 33]
_
2
kmario23

以下を試してください:

for p in result:
    print(numpy.array(p)[0])

これにより、各行がnumpy.ndarray

1
anik120