a = [1,2,3,4,5]
に変換したいa_string = "1 2 3 4 5"
。実際のnumpy配列はかなり大きい(50000x200)ので、使用for loops
が遅すぎると思います。
7 に答える
join
文字列からメソッドを使用できます。
>>> a = [1,2,3,4,5]
>>> ' '.join(map(str, a))
"1 2 3 4 5"
np.savetxt
Python 3(も参照):
import numpy as np
import sys
a = np.array([0.0, 1.0, 2.0, 3.0])
np.savetxt(sys.stdout.buffer, a)
Python 2:
import numpy as np
import sys
a = np.array([0.0, 1.0, 2.0, 3.0])
np.savetxt(sys.stdout, a)
出力:
0.000000000000000000e+00
1.000000000000000000e+00
2.000000000000000000e+00
3.000000000000000000e+00
精度を制御する
使用fmt
:
np.savetxt(sys.stdout, a, fmt="%.3f")
出力:
0.000
1.000
2.000
3.000
また:
np.savetxt(sys.stdout, a, fmt="%i")
出力:
0
1
2
3
印刷する代わりに文字列を取得する
Python 3:
import io
bio = io.BytesIO()
np.savetxt(bio, a)
mystr = bio.getvalue().decode('latin1')
print(mystr, end='')
使用するデフォルトのエンコーディングがドキュメントlatin1
に記載されているため、使用します。
Python 2:
import StringIO
sio = StringIO.StringIO()
np.savetxt(sio, a)
mystr = sio.getvalue()
print mystr
オールインワンライン
または、本当にすべてを1行にまとめたい場合:
a = np.array([0.0, 1.0, 2.0, 3.0])
np.savetxt(sys.stdout, a, newline=' ')
print()
出力:
0.000000000000000000e+00 1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00
TODO:末尾にスペースがあります。私が見る唯一の解決策は、文字列とストリップに保存することです。
Python2.7.15rc1およびPython3.6.6、numpy1.13.3でテスト済み
多分少しハッキーですが、私はそれを使用した後にそれらをスライスしますnp.array2string
:
import numpy as np
a = np.arange(0,10)
a_str = np.array2string(a, precision=2, separator=', ')
print(a_str[1:-1])
結果:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
np.array2string
たくさんのオプションもあるので、たくさんのデータで非常に役立つ列幅を設定できます。
a = np.arange(0,15)
a_str = np.array2string(a, precision=2, separator=', ', max_line_width=15)
print(' ' + a_str[1:-1])
与える:
0, 1, 2,
3, 4, 5,
6, 7, 8,
9, 10, 11,
12, 13, 14
そして、それは配列要素でスマートに分割されます。最初のブラケットを削除した後の最初の行の整列を考慮して、文字列の先頭に追加されたスペースに注意してください。
リストではなく最初にnumpy配列がある場合(投稿で「実際のnumpy配列」について言及しているため) re.sub
、配列の文字列表現に使用できます。
print(re.sub('[\[\]]', '', np.array_str(a)))
a
繰り返しになりますが、これは、ある時点で配列がnumpy配列であると想定しています。これには、行列にも対応できるという利点があります。
Numpyは、このarray_strとarray_reprに2つの関数を提供します。どちらも、ニーズに合うはずです。どちらも使用できるので、それぞれの例を次に示します。
>>> from numpy import arange, reshape, array_str
>>> M = arange(10).reshape(2,5)
>>> M
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> array_str(M)
'[[0 1 2 3 4]\n [5 6 7 8 9]]'
>>> array_repr(M)
'array([[0, 1, 2, 3, 4],\n [5, 6, 7, 8, 9]])'
これらの2つの関数はどちらも高度に最適化されているため、自分で作成する関数よりも優先する必要があります。このサイズの配列を扱うときは、可能な限りの速度が必要だと思います。
>>> a=np.array([1,2,3,4,5])
>>> print(*a)
1 2 3 4 5
>>> print(str(a)[1:-1])
1 2 3 4 5
リストと同じ
浮動小数点数と2次元配列を扱っている場合は、次のこともできます。
import numpy as np
np.random.seed(77)
def my_print(x):
for row in x:
print(' '.join(map(lambda x: "{:.3f}\t".format(x), row)))
if __name__ == '__main__':
x = np.random.random(size=(3, 9))
my_print(x)
出力:
0.919 0.642 0.754 0.139 0.087 0.788 0.326 0.541 0.240
0.545 0.401 0.715 0.837 0.588 0.296 0.281 0.706 0.423
0.057 0.747 0.452 0.176 0.049 0.292 0.067 0.751 0.064