2016-03-17 27 views
5

Tôi đang cố gắng để có được 'thời gian thực' trên máy tính xách tay Jupyter. Ví dụ có thể được tìm thấy here. Đây là mã:Cốt truyện tương tác trong sổ ghi chép Jupyter

%matplotlib notebook 

import numpy as np 
import matplotlib.pyplot as pl 

from random import randint 
from time import sleep 

from ipywidgets import FloatProgress 
from IPython import display 

siz = 10 
dat = np.zeros((siz, siz)) 

fig = pl.figure() 
axe = fig.add_subplot(111) 
img = axe.imshow(dat) 

num = 1000 

prgBar = FloatProgress(min=0, max=num-1) 
display.display(prgBar) 

for i in range(num): 
    prgBar.value = i 
    pos = (randint(0, siz-1), randint(0, siz-1)) 
    dat[pos] += 1 
    img.set_data(dat) 
    img.autoscale() 
    #sleep(0.01) 

Điều tôi đang hướng đến là xem cốt truyện đang thay đổi như thế nào với mỗi lần thay đổi. Tôi cũng đã thử thiết lập mod tương tác trên bởi pl.ion(), thay đổi backent thành inline, gọi pl.draw(), nhưng nó không hoạt động. BTW, progressbar đang làm việc tốt ...

Cảm ơn Radek

+0

Hãy xem '% matplotlib notebook' cung cấp cho bạn một chương trình phụ trợ tương tác đầy đủ. – tacaswell

+0

Bạn sẽ cần phải làm cho con số của bạn trong một tế bào khác với vòng lặp, nhưng nếu không nó sẽ làm việc. – tacaswell

+0

Nếu bạn nhìn vào liên kết tôi đăng, bạn sẽ thấy rằng họ đang ở trong các cels khác nhau. – user2329468

Trả lời

1

Các mã sau đây nên làm như lừa:

import numpy as np 
import matplotlib.pyplot as plt 

from random import randint 
from time import sleep 

from ipywidgets import FloatProgress 
from IPython.display import display, clear_output 

siz = 10 
dat = np.zeros((siz, siz)) 

fig = plt.figure() 
axe = fig.add_subplot(111) 
img = axe.imshow(dat) 

num = 1000 

prgBar = FloatProgress(min=0, max=num-1) 
display(prgBar) 

for i in range(num): 
    clear_output(wait = True) 
    prgBar.value = i 
    pos = (randint(0, siz-1), randint(0, siz-1)) 
    dat[pos] += 1 
    img.set_data(dat) 
    img.autoscale() 
    display(fig) 

Tôi đã thay đổi vòng lặp for tạo hình ảnh trên mỗi bước và cũng nhập khẩu clear_output để làm sạch đầu ra của ô trên mỗi bước.

+0

Điều này làm việc, tuy nhiên: 1) bạn phải thay đổi ma thuật matplotlib thành nội tuyến, 2) nó tạo ra ô thứ hai (vì vậy cái đầu tiên có thể được bỏ qua), nhưng chủ yếu là 3) nó rất chậm (tôi đoán vì bạn đang vẽ lại mọi điều). Vì vậy, mặc dù nó hoạt động, nó không cảm thấy như cách tối ưu ... – user2329468

+1

1) Có :-(, 2) Tôi đã sửa đổi mã để cải thiện điều này, 3) Tôi thay đổi vòng lặp để cải thiện hiệu suất khoảng 30/40% nhưng nó chậm. Tôi xin lỗi nhưng tôi không biết cách nào tốt hơn để làm điều đó trong sổ ghi chép. Cuối cùng, bạn phải 'hiển thị' hình ảnh và bạn đang hiển thị 1000 hình ảnh và giao tiếp với mặt trước và mặt sau của 1000 lần. Các 'display' bước mất khoảng 130ms và phần còn lại của mã trong vòng lặp mất khoảng 10ms hơn vì vậy mỗi bước trong vòng lặp là khoảng 140ms. NẾU bạn tìm thấy một cách tốt hơn chỉ cần đăng nó ở đây ;-) – kikocorreoso

Các vấn đề liên quan