web-dev-qa-db-ja.com

jupyter Notebookの以前の出力を上書きする

特定の時間実行されるコードの一部があり、1秒ごとにiteration X, score Yのようなものが出力されるとします。この関数をブラックボックス関数に置き換えます。

from random import uniform
import time

def black_box():
    i = 1
    while True:
        print 'Iteration', i, 'Score:', uniform(0, 1)
        time.sleep(1)
        i += 1

Jupyterノートブック で実行すると、1秒ごとに新しい行が出力されます。

Iteration 1 Score: 0.664167449844
Iteration 2 Score: 0.514757592404
...

はい、出力が大きくなりすぎるとhtmlがスクロール可能になりますが、問題は、現在の最後の行を除いてこれらの行は必要ないということです。したがって、n秒の後にn行を表示する代わりに、1行(最後の行)のみを表示したいと思います。

私は、ドキュメントや魔法を通してこのようなことを発見していません。 質問 タイトルはほぼ同じですが、無関係です。

23
Salvador Dali

@celが正しい: ipython Notebook clear cell output in code

ただし、clear_output()を使用すると、ノートブックにジッターが発生します。このようにdisplay()関数も使用することをお勧めします(Python 2.7):

from random import uniform
import time
from IPython.display import display, clear_output

def black_box():
i = 1
while True:
    clear_output(wait=True)
    display('Iteration '+str(i)+' Score: '+str(uniform(0, 1)))
    time.sleep(1)
    i += 1
31
DangerousDave

説明したことを行うための通常の(文書化された)方法(Python 3)でのみ機能します):

_print('Iteration', i, 'Score:', uniform(0, 1), end='\r')
_

Python 2では、印刷後にsys.stdout.flush()にする必要があります。これがこのように表示されます answer

_print('Iteration', i, 'Score:', uniform(0, 1), end='\r')
sys.stdout.flush()
_

IPythonノートブックを使用して、文字列を連結して機能させる必要がありました。

_print('Iteration ' + str(i) + ', Score: ' + str(uniform(0, 1)), end='\r')
_

そして最後に、Jupyterで動作するように、これを使用しました。

_print('\r', 'Iteration', i, 'Score:', uniform(0, 1), end='')
_

または、printsを_time.sleep_の前後で分割することもできます。

_print('Iteration', i, 'Score:', uniform(0, 1), end='')
time.sleep(1)
print('', end='\r') # or even print('\r', end='')
_
14
chapelo