16 / 17
Jan 2015

Na moją prośbę, wątek [brudnopis] został umieszczony tak na próbę w dziale języki, a już na czysto, będzie kopiowana w tutorialach, więc można tu śmiało pytać i komentować.

Wczytywanie i drukowanie nieokreślonej [ale też znanej z góry] ilości liczb typu np:
ai1, ai2, ai3 cz też x, y, z:
[bbone=python,2256]import sys
from numpy import *

for line in sys.stdin:
a = array(map(int64, line.split())) # tu typ dobrany do obliczen, a nie do wczytywanego

    # np obliczenia, na kolejnej trojce danych 
    x, y, z = a
    print hypot (x,y) # odleglosc pkt (x, y) od pkt (0, 0) wsp z pomijamy

    # w numpy korzystamy z bogatej listy funkcji wbudowanych do klasy array
    # np 
    print a.sum()
    print '-----------------'

[/bbone]
Możemy testować na ideone.
Aby skorzystać z numpy u siebie, w linuxie instalujemy wszystkie pakiety z całym bogactwem inwentarza, jedną komendą [możemy też indywidualnie poszczególne pakiety]:
[color=#000080]sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose[/color] :: scipy.org/install.html1

PS
tricks będą kontynuowane!, ewentualnie także z Twoją pomocą wink

Dla referencji, Narbej odnosi się do pierwszego z serii zadań nauki Numpy'a. smile viewtopic.php?f=1&t=28275

Z referencyjnych solucji:

[bbone=python,2259]
from sys import stdin
from numpy import loadtxt

tab = loadtxt(stdin, dtype=int64)
for line in tab:
x,y,z = line
[/bbone]
[docs.scipy.org/doc/numpy/referen ... py.loadtxt](http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html#numpy.loadtxt)

Postuj dalej! Będę odpowiadał na każdy post. wink

Wiemy jak wczytywać dane, to teraz kolej na wypisywanie. Mamy tu podstawową komendę [color=#0000BF][b]print[/b][/color], ale czasami potrzeba bardziej wymyślny/wyrafinowany format wydruku. Drugą metodą jest: [color=#0000BF][b]sys.stdout.write([/b][/color]... , może jeszcze jakaś meoda?
Korzystając z uprzejmości, Arku, proszę, jeżeli można o rozwinięcie tematu drukowania. Czy numpy oferuje tu coś ekstra? Wydruk dodatkowych spacji z tyłu i przodu [łodygi i liście wink], a także formatowanie liczb typu float/double zaoukrąglanych lub ucinanych do kilku miejsc po przecinku.

Numpy posiada też metody do zapisywania tablic (do wielu formatów, binarnych i tekstowych).
Możesz przejrzeć metody z tej listy: docs.scipy.org/doc/numpy/referen ... es.io.html2

Dane do zadania wygenerowałem tym kodem: wink (serio dwie linie)

[bbone=python,2263]
from sys import stdout
from numpy.random import randint
from numpy import savetxt

a = randint(10, 99, (100,3))
savetxt(stdout, a, '%d')
[/bbone]

Ah, by eksportować do HTML (na Windowsie) potrzebujesz jeszcze doinstalować jakiś program, zapomniałem nazwy, to chyba Tornado.
github.com/tornadoweb/tornado/releases

A wracając do sedna: tutorial uczy korzystać z faktu że, mimo iż Python jest wooolny, operacje na tablicach są szybkie. Bo są zaimplementowane natywnie. I To jest podstawowa lekcja. Jak się posługiwać tablicami to jest długi i twardy temat którego nie zamierzam rozpisywać. Sami musicie poświęcić czas na naukę. Podałem w zadaniu bardzo przystępną prezentację. wink
nbviewer.ipython.org/github/jrjo ... umpy.ipynb

PS co do GCD

Oj nie doczytałeś dokładnie tekstu o gcd [do końca] wink i oczywiście pisałem, że to nie problem, gdy się wie, tylko trzeba wiedzieć, jak jest. Z porównywanych języków tylko haskell był ok wink

-- So sty 24, 2015 1:59 pm --

Niestety, muszę się dokleić i sam sobie odpowiedzieć kontynuować. Nie chodzi mi o to, że gcd dla ujemnych parametrów zwraca ujemną wartość. Chodzi mi o to, że w jednym języku zwraca wartość dodatnią. Możliwe, że liczenie gcd dla ujemnych wartości jest głupim pomysłem, trudno sobie wyobraźić aby piękna pani Agnieszka,1 miała ujemną liczbę cukierków, ale już z kartą debetową łatwiej. W tej kwesti mógłby zabrać głos matematyk, czy można liczyć gcd [NWD] z ujemnych liczb i jaką wartość powinna zwracać funkcja.

Twoje obie funkcje gcd są super i brakuje im tylko małego bajeru: """ bajer wink """
Porównaj - kliknij show submissions a potem more:
[bbone=python,2287]from fractions import gcd

help(gcd) [/bbone]
zamiast help można też wpisać gcd? lub info(gcd) lub w notebook'u tak samo albo gcd( i shift + tab + tab + tab, lub tylko wpisać gcd( i trochę poczekać

Czyli tak mogłaby wyglądać twoja funkcja gcd wink:
[bbone=python,2288]def gcd(a, b):
""" Bajer wink np:
Oblicza ...... tylko dla dodatnich a i b?"""
while (b <> 0):
a, b = b, a%b
return a # lub abs(a)

help(gcd)[/bbone]
Na czysto opiszę jednym zdaniem o co chodzi z bajerem - tu tylko dla pamięci.

Wracając do numpy, obrazy są reprezentowane jako tablice o wymiarach (H,W,3), co będzie potrzebne w zadaniu JPEG.
Niedługo skończę zadanie JPEG więc zacznę poruszać ten temat. wink

Gdy chcemy odwołać się do komponentu B (z RGB):
[bbone=text,2292]
R = img[:,:,2]
[/bbone]

Gdy chcemy co drugi piksel w pionie i poziomie:
[bbone=text,2293]
A = R[0::2,0::2]
[/bbone]

-- Pn sty 26, 2015 6:48 am --

Dzięki interwencji Kokoska wreszcie skończyłem JPEGa. Okazuje się że IPython importuje więcej nazw niż zwykły Python.
Dla przykładu takie coś działa bez problemu w Notebooku ale NZEC na spoju. Dlaczego? Bo nie importowałem int64 ani arange. astonished

A tak swoją drogą, jeśli korzystasz z Notebooka to możesz łatwo "zifować" by korzystał z lokalnych plików
gdy używasz notebooka a ze stdin gdy wklejasz na spoju: (przydatne wink )

Raczej jest to mało prawdopodobne, a wręcz nie wink niemożliwe. Ani ipython, ani notebook, o ile wiem, nie robi sam z siebie takich rzeczy. Wyjaśnieniem, może być, albo jakaś konfiguracja notebooka, automatycznie uruchamiająca takie środowisko w momencie startu albo wydane gdzieś wcześniej z "palca" jakieś polecenie, np polecenie notebooka:
[bbone=python,2299]%pylab[/bbone]powoduje, że w sesji dostępne są przestrzenie nazw np nupy'a. Po tym poleceniu np do arange, możemy odwoływać się zarówno:
nupy.arange(...)
jak i:
arange(...)
Wykonanie w tym momencie importu z nupy'ego, nic nie zmieni, chyba że użyjemy
[bbone=python,2300]from numpy import arange as ar [/bbone]czy
[bbone=python,2301]import numpy as np[/bbone]

%pylab można uruchamiać z różnymi dodatkowymi, opcjonalnymi parametrami np: inline, --no-import-all, ... itd

%pylab to nie jest jedyne, tak działające polecenie notebooka.

Są trzy środowiska IPythona. (1) Notebook (2) Qt Console i (3) zwykła konsola. To pierwsze polecam nad wszystko inne. Drugie chyba też jest graficzne mimo tekstowego wyglądu, a więc może wyświetlać wykresy. Trzecie pewnie znasz, czysta konsola.

Do obejrzenia obrazka, proponujesz taką sekwencję poleceń [ze swojej sesji notebooka]:
obrazek = load('sciezka_i_plik_danych')
%matplotlib inline
imshow(obrazek)

Jednak, Ty uruchamiając notebooka, masz już prawdopodobnie załadowane środowisko, więc u Ciebie środkowa linia, jest całkowicie zbędna. Ja mam "czystego" notebooka i świadomie nie chcę tego zmieniać, aby takie sytuacje wyłapywać i weryfikować.
W mojej sytuacji [już to pisałem?] prawidłowa kolejność jest taka:
%pylab inline
obrazek = load('sciezka_i_plik_danych')
imshow(obrazek)

Warto zaznaczyć i może opisać czym są instrukcje poprzedzone: %, %%. Są to instrukcje - magiczne rozszerzenia intraktywnego shella pythona [w normalnym programie pewnie nie działają?] i są odpowiednikiem importu jednego czy grupy modułów np numpa + matlibplot itd.
cdn

Według mnie, pomiędzy %matplotlib, a %pylab, jest niewielka ale istotna różnica. Niestety Ty jej nie widzisz, bo masz notebooka ze skonfigurowanym już "startowo" środowiskiem. A że nie masz tam ustawionego inline, to już inna sprawa. Teraz właśnie dokładnie, widać to o czym pisałem, nie potrzebujesz ani jednej ani drugiej instrukcji, aby u Ciebie działały programy korzystające z numpy [load] czy z biblioteki matplot [imshow].
Jaka jest więc ta różnica, pomiędzy %matlibplot, a %pylab?
A no taka, że %matplotlib ładuje tylko moduł i wszystko cp trzeba tylko do rysowania [plotowanie], ale nie ładuje np numpa.
%pylab [conajmnie] ładuje zarówno numpa jak i moduł[y] ładowany[e] przez %matplotlib
I to właśnie widzę u siebie, pomijając przełącznik inline i co zapewne opisane jest w dokumentacji np: %maplotlib? czy %pylab?, ale komu by się tam chciało to czytać i sprawdzać [mi się nie chce/chciało :wink:]
[bbone=text,2315]%pylab?

%pylab [--no-import-all] [gui]

Load numpy and matplotlib to work interactively.

This function lets you activate pylab (matplotlib, numpy and
interactive support) at any point during an IPython session.

%pylab makes the following imports::

import numpy
import matplotlib
from matplotlib import pylab, mlab, pyplot
np = numpy
plt = pyplot

from IPython.display import display
from IPython.core.pylabtools import figsize, getfigs
from IPython.display import display
from IPython.core.pylabtools import figsize, getfigs

from pylab import *
from numpy import *

If you pass --no-import-all, the last two * imports will be excluded.

See the %matplotlib magic for more details about activating matplotlib
without affecting the interactive namespace.

positional arguments:
gui Name of the matplotlib backend to use ('gtk', 'inline',
'osx', 'qt', 'qt4', 'tk', 'wx'). If given, the
corresponding matplotlib backend is used, otherwise it will
be matplotlib's default (which you can set in your
matplotlib config file).

optional arguments:
--no-import-all Prevent IPython from performing import * into the
interactive namespace. You can govern the default behavior
of this flag with the InteractiveShellApp.pylab_import_all
configurable.
(END)

[/bbone]
Już tu nie będę wklejał %matplotlib?

Ten jednolinijkowiec mi nie działa, chociaż on nie przyśpieszy mi programu, ale na pewno program ładniej by wyglądał.
W rozwiązywaniu zadania na konwersję RGB do jpeg dojechałem do pkt kodowanie entropii.! Ale dane przykładowe, mój program przetwarza 14 sek, więc się zastanawiam, czy "jechać" dalej, czy poprawić coś we wcześniejszym kodzie. Trochę nawet próbowałem coś pozmieniać, ale nadal bez zmian - ok 14 sek. Może jednak to moj notebook [tym razem mówię o fizycznym komputerze a nie o ipython notebook], jest za wolny?

A temat nie wysechł. Mam nawet pytanie, ale możliwe, że warto zrobić z tego pytania zadanie, więc na razie nie będę go tu zadawał.

Pomyliłem x i y, oops. 14 sek to dużo za dużo, coś musi być nie tak. Zrób tak: wklej swój kod do notebooka, podziel na cele, i na początku każdej celi dopisz %%time. Będziesz wiedział co jest tak wolne.

Jako że swiergu jako pierwszy rozwiązał zadanie JPEG, nie mogłem się powstrzymać i podejrzałem jego submita. Swiergu użył czegoś co działa choć nawet mi nie przyszło do głowy że tak można. Porównam więc te dwie metody tutaj. Chodzi o to jak zmienić kolejność elementów z range na zigzag.

Swiergu użył czegoś w rodzaju macierzy jednostkowej, ja natomiast użyłem czegoś co się nazywa "fancy indexing". Mnożenie macierzy jest w numpy realizowane jako iloczyn skalarny po współrzędnych (dot product element-wise).

Brawo swiergu!