[python] matice v pythonu

Jan Jakubuv jakubuv na gmail.com
Středa Říjen 15 19:07:02 CEST 2008


zdravim,

hotovou knihovnu jiste najdete, ale pokud jste zacatecnik jiste pro
vas bude uzitecne zkusit si zakladni operace naprogramovat. Pro
reprezentaci matic bych pouzil seznam seznamu (cisel) spise nez n-tice
n-tic napriklad proto, ze seznamy lze na rozdil od n-tic upravovat
(pridavat/menit/ubirat prvky).
Matici reprezentovanou jako seznam seznamu bych obalil objektem, coz
vam umozni napriklad pretizeni aritmetickych operatoru +,-,*, atd. tak
aby fungovaly spravne pro matice. Napriklad, operator + pretizite
pridanim metody __add__(self, other) kde other je matice ktera se
pricita (k matici self) --- viz priklad nize. Dale bych pretizil
indexovaci operator [], ktery vam umozni pristupovat k prvkum matice
primo jako by objekt byl primo seznam seznamu. Indexovaci operator
pretizite pridanim metody __getitem__(self, key) kde key je index toho
prvku ktery ma metoda vratit (napriklad kdyz zavolate m[3] tak key je
3).

Shruba receno udelal bych to nejak takto:

class Matice(object):
    def __init__(self, matice=[[]]):
        self.matice = matice

    def __getitem__(self, key):
        # umozni indexovani objektu jakoby matice byla primo seznam seznamu
        return self.matice[key]

    def __str__(self):
        # vrati retezec reprezentujici matici (vytiskne ji po radcich)
        radky = ''.join([str(radek)+"\n" for radek in self.matice])
        return radky.rstrip("\n")

    def __add__(self, other):
        # soucet matic
        radky = zip(self.matice, other.matice)
        soucet = [[a+b for (a,b) in zip(radA,radB)] for (radA,radB) in radky]
        return Matice(soucet)

Takovy objekt pak muzete pouzit napriklad takto:

>>> m1 = Matice([[1,2,3],[4,5,6]])
>>> m2 = Matice([[1,2],[4,5],[4,5]])
>>> print m1
[1, 2, 3]
[4, 5, 6]
>>> print m2
[1, 2]
[4, 5]
[4, 5]
>>> print m1[1][1]
5
>>> print m1+m2
[2, 4]
[8, 10]

To vse je jen tak velice zhruba. Muzete dale pridat kontrolu radu
matic a scitat pouze matice stejneho radu. Muzete pretizit dalsi
numericke operatory jako - (odcitani matic metodou __sub__), *
(nasobeni matic metodou __mul__), ~ (inverzni matice metodou
__invert__), - (opacna matice metodou __neg__) a dalsi...

V neposledni  se take muze hodit doplnit dalsi funkce indexovaciho
operatoru pridanim metod __setitem__, __delitem__, __setslice__ a
mnohem vic ;-)

Doufam, ze je vse primerene pochopotelne a srozumitelne. Kdyby ne tak
se ptejte..

honza.


Dne 15. říjen 2008 16:14  <pedro-py na email.cz> napsal(a):
> Dobrý den,
> jsem začátečník a pravděpodobně se ptám úplně hloupě. Potřebuji řešit nějaké operace s maticemi a nerad bych vymýšlel vymyšlené. Předně bych se chtěl zeptat, jaký je nejvhodnější formát pro zápis matic - n-tice n-tic? Nebo něco jiného? Dále by mě pak zajímalo, zda neexistuje nějaká knihovna, která by nástroje pro práci s maticemi obsahovala. Asi bych byl schopen po čase potřebné funkce naprogrmovat, ale proč to dělat, kdyby to již bylo vymyšleno, že :-)? Předem díky za jakoukoliv radu.
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
>


Další informace o konferenci Python