1

私が探しているものに近い質問と回答がいくつかありますが、この特定の問題に対するよりエレガントな解決策がないかどうか疑問に思っています: numpy (2D) 配列があり、それを印刷したい行ごとに行番号を前もって付けます - そしてもちろんうまくフォーマットされています。

このコードは、単純ですが書式設定なしで印刷を行います。

import numpy as np
A = np.zeros((2,3))
for i in range(2):
    print i, A[i]

各行でフォーマットされた文字列を新たに構築することで、フォーマットされた出力を生成することもできます。

for i in range(2):
    print "%4i "%(i)+" ".join(["%6.2f"%(v) for v in A[i]])

これは機能しますが、フォーマット文字列を一度だけ作成してから、各行に数値を「貼り付ける」方が読みやすく、おそらく効率的(?)である可能性があると考えました。

NVAR=A.shape[1]
fmt = "%4i" + NVAR*"  %6.2f"
for i in range(2):
    print fmt % (i, A[i])

書式設定された出力では float 要素を含むタプルが必要ですが、A[i] は ndarray であるため、これは失敗します。したがって、私の質問は「整数値と 1 次元の ndarray からタプルを作成するにはどうすればよいですか?」ということになります。私は試しました:

    tuple( [i].extend([v for v in A[i]]) )

[v for v in A[i]]しかし、それは機能しません (この式は正しく機能しますが、None を返します)。

それとも、ここで FORTRAN を考えすぎているのでしょうか。

4

3 に答える 3

1

tolist()numpy 配列をfirstでリストに変換できます。

for i in range(2):
    print fmt % tuple([i] + A[i].tolist())

エラーの理由は、リストを拡張しても戻り値が得られないことです。

>>> x = range(5)
>>> x.extend([5, 6])
>>> x
[0, 1, 2, 3, 4, 5, 6]

+演算子は、リストの連結用です。

于 2013-09-07T20:14:09.400 に答える
1

tupleコンストラクターを使用して、配列要素をタプルに直接変換できます。

for i in range(2):
    print fmt % ((i, ) + tuple(A[i]))

ここでは、+タプル連結を表します。

また、FORTRAN から来ている場合はenumerate、このタイプのループ操作に便利なについてまだ知らないかもしれません。

for i, a in enumerate(A):
    print fmt % ((i, ) + tuple(a))

これを と組み合わせてitertools.chain、 enumerate からのペアを平坦化できます。

import itertools

for i, a in enumerate(A):
    print fmt % tuple(itertools.chain((i, ), a))

これらはすべて、あなたがここでやろうとしていることに対しておそらくやり過ぎですが、それを行う方法をさらにいくつか示したかっただけです。

于 2013-09-08T17:09:36.107 に答える
0

これが簡単な解決策です:

import numpy as np
A = np.random.rand(200,3)
for i in xrange(98, 102):
    print '{0:4d} {1}'.format(i, A[i]) #'4d' reserves space for 4 digits
                                       # Modify to the maximum # of rows

出力は次のようになります。

  98 [ 0.40745341  0.29954899  0.21880649]
  99 [ 0.23325155  0.81340095  0.57966024]
 100 [ 0.24145552  0.12387366  0.0384011 ]
 101 [ 0.76432552  0.68382022  0.93935336]
于 2013-09-09T19:43:24.110 に答える