切り詰めずに、NumPy配列全体を出力する方法は?


589

numpy配列を出力すると、切り捨てられた表現が表示されますが、完全な配列が必要です。

これを行う方法はありますか?

例:

>>> numpy.arange(10000)
array([   0,    1,    2, ..., 9997, 9998, 9999])

>>> numpy.arange(10000).reshape(250,40)
array([[   0,    1,    2, ...,   37,   38,   39],
       [  40,   41,   42, ...,   77,   78,   79],
       [  80,   81,   82, ...,  117,  118,  119],
       ..., 
       [9880, 9881, 9882, ..., 9917, 9918, 9919],
       [9920, 9921, 9922, ..., 9957, 9958, 9959],
       [9960, 9961, 9962, ..., 9997, 9998, 9999]])

18
「1回限り」でそれを行う方法はありますか?つまり、スクリプトで一度に完全な出力を出力し、他の時間には出力しないようにするには、
tumultous_rooster

4
@マット・オブライエンは、ZSGの回答を以下で参照
user2398029

6
受け入れられた回答を推奨する回答に変更できますnp.infか?np.nanそして'nan'合計まぐれによってのみ作業、および'nan'Pythonの3にさえない仕事をして、彼らは混合型の比較の実装変更されたためthreshold='nan'に依存します。
user2357112は

1
threshold=np.nanよりもむしろ'nan'アレイ印刷ロジックと閾値配列のサイズを比較することである異なる吸虫、に依存するa.size > _summaryThreshold。これは常に返すFalseため_summaryThreshold=np.nan、比較がされていた場合a.size <= _summaryThreshold、アレイが完全に印刷されるべきかどうかを試験する代わりに、それが必要かどうかをテスト要約すると、このしきい値はすべてのアレイの要約をトリガーします。)
user2357112は

4
「一回限り」、それを行う方法:あなたがnumpy.arrayを持っている場合tmpだけlist(tmp)。書式設定が異なるその他のオプションは、tmp.tolist()またはより詳細に制御するためのものprint("\n".join(str(x) for x in tmp))です。
travc

回答:


629

使用numpy.set_printoptions

import sys
import numpy
numpy.set_printoptions(threshold=sys.maxsize)

2
numpy配列を1回だけ印刷する場合、残念ながらこのソリューションには、印刷後にこの構成変更をリセットする必要があるという欠点があります。
Trevor Boyd Smith

1
@TrevorBoydSmith、印刷後にこのパラメーターをリセットする方法を知っていますか?
ColinMac

1
@ColinMacは、彼が設定を保存するstackoverflow.com/a/24542498/52074を参照してください。操作を行います。その後、設定を復元します。
Trevor Boyd Smith、

1
そして、それを通常にリセットする方法は?
Gulzar

しきい値サイズを手動で入力する方法はありますか?
Amar Kumar

226
import numpy as np
np.set_printoptions(threshold=np.inf)

他の人が提案するnp.inf代わりに使用することをおnp.nan勧めします。どちらも目的に応じて機能しますが、しきい値を「無限大」に設定することで、コードを読んでいる誰もがあなたの意図を明らかにします。「数ではない」というしきい値を持つことは、私には少し曖昧に思えます。


15
これの逆の操作は何ですか?以前の設定に戻す方法(ドット付き)?
Karlo

9
@Karloデフォルトの数は1000なのでnp.set_printoptions(threshold=1000)、デフォルトの動作に戻します。ただし、このしきい値は好きなだけ低くまたは高く設定できます。np.set_printoptions(threshold=np.inf)無限に切り捨てられる前に、印刷された配列の最大サイズを変更するだけなので、どんなに大きくても切り捨てられません。しきい値を任意の実数に設定すると、それが最大サイズになります。
PaulMag 2017年

8
これはより明確であるだけでなく、壊れにくくなっています。存在しない特別な処理のためにはnp.infnp.nan、または'nan'。そこに何を置いても、NumPyはプレーン>を使用して配列のサイズをしきい値と比較します。np.nanそれはだからだけの作業に何が起こるa.size > _summaryThresholdの代わりにa.size <= _summaryThreshold、とnp.nanリターンFalseのすべてのために>/ </ >=/ <=比較。'nan'Python 2の混合型比較ロジックの脆弱な実装の詳細により、たまたま機能するだけです。それは、Python 3に完全に壊れる
user2357112サポートモニカ

2
値はintと記載されているため、sys.maxsizeを使用してください
マットチップ

2
@Karloの質問に正しく答えるために、印刷オプションのしきい値の初期値はにあることに注意してくださいnp.get_printoptions()['threshold']。しきい値を設定する前にこの値を保存し、後でそれを復元できます(またはwith他の回答で提案されているようにブロックを使用します)。
Ninjakannon

94

以前の答えは正しいものですが、より弱い選択肢として、リストに変換することができます:

>>> numpy.arange(100).reshape(25,4).tolist()

[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19], [20, 21,
22, 23], [24, 25, 26, 27], [28, 29, 30, 31], [32, 33, 34, 35], [36, 37, 38, 39], [40, 41,
42, 43], [44, 45, 46, 47], [48, 49, 50, 51], [52, 53, 54, 55], [56, 57, 58, 59], [60, 61,
62, 63], [64, 65, 66, 67], [68, 69, 70, 71], [72, 73, 74, 75], [76, 77, 78, 79], [80, 81,
82, 83], [84, 85, 86, 87], [88, 89, 90, 91], [92, 93, 94, 95], [96, 97, 98, 99]]

14
これは、printステートメントで配列全体を確認するための最良の1回限りの方法のようです。
アーロンブラムソン、

@AaronBramson同意します...これは、1つの印刷ステートメント(構成の変更、印刷、構成のリセットの3行ではなく1行のコード)が必要な場合にエラーが発生しにくくなります。
Trevor Boyd Smith

私はこれがカンマ区切りを出力するのが好きです
ObviousChild

58

NumPy 1.15以降

NumPy 1.15(2018-07-23リリース)以降を使用している場合は、printoptionsコンテキストマネージャーを使用できます。

with numpy.printoptions(threshold=numpy.inf):
    print(arr)

(もちろん、交換するnumpyことにより、npそれはあなたがインポート方法です場合numpy

コンテキストマネージャー(with-block)を使用すると、コンテキストマネージャーが終了した後、印刷オプションがブロックが開始する前の状態に戻ります。これにより、設定が一時的で、ブロック内のコードにのみ適用されます。

参照numpy.printoptionsドキュメントコンテキストマネージャの詳細と、それがサポートしている他の引数のために。


41

numpyを使用しているようです。

その場合は、以下を追加できます。

import numpy as np
np.set_printoptions(threshold=np.nan)

コーナー印刷が無効になります。詳細については、このNumPyチュートリアルを参照してください。


4
ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Eric

はい、公式のNumpyチュートリアルのその部分は間違っています
aderchox

36

これを行う1回限りの方法を以下に示します。これは、デフォルト設定を変更したくない場合に役立ちます。

def fullprint(*args, **kwargs):
  from pprint import pprint
  import numpy
  opt = numpy.get_printoptions()
  numpy.set_printoptions(threshold=numpy.inf)
  pprint(*args, **kwargs)
  numpy.set_printoptions(**opt)

13
これはコンテキストマネージャを使用するのに適した場所と思われるため、「with fullprint」と言うことができます。
ポールプライス14

8
使用しないでください'nan'np.nanまたは上記のいずれか。これはサポートされておらず、この悪いアドバイスはpython 3に移行する人々に苦痛を与えています
Eric

1
ライン5を置き換え@ZSGnumpy.set_printoptions(threshold=numpy.inf)
ニーマル

@Nirmalに感謝します。この2014年の回答を編集して、今日も機能するようにしました。
ポールルージュ

31

Paul Priceが提案したようにコンテキストマネージャを使用する

import numpy as np


class fullprint:
    'context manager for printing full numpy arrays'

    def __init__(self, **kwargs):
        kwargs.setdefault('threshold', np.inf)
        self.opt = kwargs

    def __enter__(self):
        self._opt = np.get_printoptions()
        np.set_printoptions(**self.opt)

    def __exit__(self, type, value, traceback):
        np.set_printoptions(**self._opt)


if __name__ == '__main__': 
    a = np.arange(1001)

    with fullprint():
        print(a)

    print(a)

    with fullprint(threshold=None, edgeitems=10):
        print(a)

7
このコンテキストマネージャは、numpyの1.15へのおかげで内蔵されてgithub.com/numpy/numpy/pull/10406を名前で、np.printoptions
エリック・

13

numpy.savetxt

numpy.savetxt(sys.stdout, numpy.arange(10000))

または、文字列が必要な場合:

import StringIO
sio = StringIO.StringIO()
numpy.savetxt(sio, numpy.arange(10000))
s = sio.getvalue()
print s

デフォルトの出力形式は次のとおりです。

0.000000000000000000e+00
1.000000000000000000e+00
2.000000000000000000e+00
3.000000000000000000e+00
...

また、追加の引数を使用して構成できます。

特に、これが角括弧を表示せず、多くのカスタマイズが可能になることに注意してください。これは、括弧なしでNumpy配列を出力する方法は?

Python 2.7.12、numpy 1.11.1でテスト済み。


1
この方法のマイナーな欠点は、1次元および2次元配列でのみ機能することです
Fnord '

@Fnordこの情報をありがとう、回避策を見つけたら教えてください!
Ciro Santilli郝海东冠状病六四事件法轮功

10

これは、若干の修正(削除に追加の引数を渡すためのオプションであるset_printoptions)neokの答え。

それはあなたがcontextlib.contextmanagerより少ないコード行でそのようなコンテキストマネージャーを簡単に作成するためにどのように使用できるかを示しています:

import numpy as np
from contextlib import contextmanager

@contextmanager
def show_complete_array():
    oldoptions = np.get_printoptions()
    np.set_printoptions(threshold=np.inf)
    try:
        yield
    finally:
        np.set_printoptions(**oldoptions)

あなたのコードでは次のように使用できます:

a = np.arange(1001)

print(a)      # shows the truncated array

with show_complete_array():
    print(a)  # shows the complete array

print(a)      # shows the truncated array (again)

1
あなたは、常に置いてくださいtry/ finally周りをyieldクリーンアップがどのように関係なく起こるように、コンテキストマネージャに。
エリック

1
@Eric確かに。役立つコメントをありがとうございました。回答を更新しました。
MSeifert 2018

1.15では、これはスペルで入力できますwith np.printoptions(threshold=np.inf):
Eric

6

列の最大数(で固定)からのこの回答を補完するnumpy.set_printoptions(threshold=numpy.nan)ために、表示される文字の制限もあります。(インタラクティブセッションではなく)bashからpythonを呼び出すときなどの一部の環境では、linewidth次のようにパラメーターを設定することでこれを修正できます。

import numpy as np
np.set_printoptions(linewidth=2000)    # default = 75
Mat = np.arange(20000,20150).reshape(2,75)    # 150 elements (75 columns)
print(Mat)

この場合、ウィンドウは行を折り返す文字数を制限する必要があります。

崇高なテキストを使用していて、出力ウィンドウ内に結果を表示したい場合は、ビルドオプション"word_wrap": falseをsublime-buildファイル[ source ]に追加する必要があります。



4

オフにして通常モードに戻るには

np.set_printoptions(threshold=False)

それは私のために動作します(Jupyter pythonバージョン3)。以下のコードを試すことができます。公式のドキュメントに従って、以下のコードはデフォルトのオプションに戻す必要があります。それは私にとってもそうでした。> np.set_printoptions(edgeitems = 3、infstr = 'inf'、linewidth = 75、nanstr = 'nan'、precision = 8、suppress = False、threshold = 1000、formatter = None)
ewalel

はい、Jupyterを使用していないためです。受け入れられた答えは、純粋なpython環境でも機能します。
Mathyou

これはを意味します。つまりthreshold=0、「できるだけ早く切り捨てる」ことを意味します-希望するものではありません。
Eric

2

派手な配列があるとしましょう

 arr = numpy.arange(10000).reshape(250,40)

(np.set_printoptionsを切り替えずに)配列全体を1回限りの方法で印刷したいが、コンテキストマネージャーよりも単純な(コードが少ない)場合は、次のようにします。

for row in arr:
     print row 

2

わずかな変更:(大量のリストを印刷するため)

import numpy as np
np.set_printoptions(threshold=np.inf, linewidth=200)

x = np.arange(1000)
print(x)

これにより、1行あたりの文字数が増加します(デフォルトの線幅は75)。コーディング環境に適した線幅の任意の値を使用してください。これにより、1行あたりの文字数を増やすことで、膨大な数の出力行を経由する必要がなくなります。


1

array2string関数-docsを使用できます。

a = numpy.arange(10000).reshape(250,40)
print(numpy.array2string(a, threshold=numpy.nan, max_line_width=numpy.nan))
# [Big output]

ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Eric

1

特に大規模な配列の場合は、常にすべてのアイテムを印刷する必要はありません。

より多くのアイテムを表示する簡単な方法:

In [349]: ar
Out[349]: array([1, 1, 1, ..., 0, 0, 0])

In [350]: ar[:100]
Out[350]:
array([1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1,
       1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1])

デフォルトでスライスされた配列<1000の場合、正常に機能します。


0

パンダがいるなら

    numpy.arange(10000).reshape(250,40)
    print(pandas.DataFrame(a).to_string(header=False, index=False))

のリセットが必要になるという副作用を回避しnumpy.set_printoptions(threshold=sys.maxsize)、numpy.arrayとブラケットを取得しません。これは、ワイドアレイをログファイルにダンプするのに便利です。


-1

配列が大きすぎて印刷できない場合、NumPyは自動的に配列の中央部分をスキップしてコーナーのみを印刷しますset_printoptions。この動作を無効にしてNumPyに配列全体を印刷させるには、を使用して印刷オプションを変更できます。

>>> np.set_printoptions(threshold='nan')

または

>>> np.set_printoptions(edgeitems=3,infstr='inf',
... linewidth=75, nanstr='nan', precision=8,
... suppress=False, threshold=1000, formatter=None)

詳細については、「または一部」numpyドキュメント numpyドキュメントを参照することもできます。


3
使用しないでください'nan'np.nanまたは上記のいずれか。これはサポートされておらず、この悪いアドバイスはpython 3に移行する人々に苦痛を与えています
Eric

ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Eric
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.