Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 5, 2007 00:29:48

rasser_depressnjak
От:
Зарегистрирован: 2006-12-12
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

matrix has python or python

всем доброго времени суток!
недавно возникла необходимость написать небольшую програмку, оперирующую с двухмерными массивами они же матрицы в пайтоне
в инете нарыл информацию что пайтон напрямую матрицы не поддерживает но это вроде можно сделать с помощью библиотек ScientificPython и numpy, но к сожаленью из мануалов не особо выяснил как их использовать и какая из этих библиотек нажна для реализации данного варианта т.к. в примерах рассматривалось их одновременное использование да и в далеких от матриц областях
если кто-то сталкивался с чем-то подобным с матрицами в пайтоне поделитесь опытами и если есть хоть небольшей кусочек кода иллюстрирующий такую работу…



Офлайн

#2 Авг. 5, 2007 09:19:13

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

matrix has python or python

В стандартном Python двумерные массивы есть. Матричных операций нет. Какие конкретно операции с данными нужны?



Офлайн

#3 Авг. 5, 2007 11:09:59

nss
От:
Зарегистрирован: 2007-01-06
Сообщения: 103
Репутация: +  0  -
Профиль   Отправить e-mail  

matrix has python or python

Офлайн

#4 Авг. 5, 2007 17:35:31

$m1t
От:
Зарегистрирован: 2006-12-31
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

matrix has python or python

Вот немного моего кода - может чем поможет

from numpy import *
from numarray import *
import porterlib
import prepro
import math
import datetime
now = datetime.datetime.now()
lines=(open('input')).readlines()
rawsent,sentences=prepro.prepro(lines)
w2n={}
n2w={}
k=0
for sent in sentences:
    words=string.split(sent)
    for word in words:
        if not w2n.has_key(word):
            w2n[word]=k
            n2w[k]=word
            k+=1
m=[]
#print sentences
for sent in sentences:
    words=string.split(sent)
    vector=map(lambda x: 0,range(len(w2n.keys())))
    for word in words:
        vector[w2n[word]]+=1
    m.append(vector)
#print m
mtr=transpose(array(m))
u,s,vt = linalg.svd(mtr)
n=0 # counter for number of remaining singular values
for k in range(len(s)):
    if s[k]<s[0]/2.0:
        s[k]=0
        n+=1
# now in n number of remaining singular values
v=transpose(vt)
def score(k):
    result=0
    for t in range(len(v[k])):
        result+=v[k][t]*v[k][t]*s[t]*s[t]
    return math.sqrt(result)
scores=[]
for k in range(len(sentences)):
    scores.append((score(k),k))
scores.sort(None,None,True)
output=open('output.txt','w')
for i in range(20):
    output.write(str(rawsent[scores[i][1]]))
    output.write('\n')
output.write('----\n')
output.write(str(mtr.shape))
output.write(str(datetime.datetime.now()-now))

1. Есть хорошая сборка питона Enthought Edition в которую входят все нужный библиотеки. Доки по numpy вполне сносного качества - гугл+ они и разобраться можно.
2. Печально но на больших (10^5) матрицах у меня нумерик питон вылетает с ошибкой =(
3. Что делает код помню уже смутно - реализация какого то алгоритма обработки текстов, с использованием матриц.
p.s. Выскажите критику по коду, если можно - что пишу косо и что можно писать лучше?



Отредактировано (Авг. 5, 2007 17:36:41)

Офлайн

#5 Авг. 5, 2007 23:48:08

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

matrix has python or python

Только то, что есть великолепные конструкции для списков:

вместо
scores=
for k in range(len(sentences)):
scores.append((score(k),k))
Пишем
scores =
И так далее.
После соответствующей переработки стоит посмотреть на код заново.
Вместо d.has_key(k) GvR советует истользовать k in d (или k not in d, если нужно).

То же есть и для генераторов. Часто нужны именно они, а не длинные списки.



Офлайн

#6 Авг. 6, 2007 02:12:33

xonix
От:
Зарегистрирован: 2006-12-31
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

matrix has python or python

@$m1t

От себя посоветую давать более осмысленные имена (чем w2n, n2w) особенно для глобальных переменных, для локальных из-за инкапсуляции еще можно простить.
Потом, все же не плохо придерживаться отступов, в частности перед и после “=”, “+=” и прочих операторов, а также после запятых.
Затем, модуль sting лучше не использовать в виду того, что обычно нужные методы есть в самих строковых объектах, в частности

>>> string.split('hello world 12')
['hello', 'world', '12']
>>> str.split('hello world 12')
['hello', 'world', '12']
>>> 'hello world 12'.split()
['hello', 'world', '12']
>>> 
И, на конец рекомендовал бы организовывать программу в виде:

def main():
    print 'Hello world'
if __name__ == '__main__':
    main()

Или, даже так

import sys
def main():
    print 'Hello world'
    return 0
if __name__ == '__main__':
    sys.exit(main())

Это позволяет лучше структурировать код и поможет если охота импортировать файл с программой как модуль.
Ну и по мелочи:
lines=(open('input')).readlines()
#=>
lines = open('input').readlines()
#----------------------------------
w2n={}
n2w={}
# =>
w2n = n2w = {}
#----------------------------------
vector=map(lambda x: 0,range(len(w2n.keys())))
# =>
vector = [0] * len(w2n)



Офлайн

#7 Авг. 6, 2007 11:38:54

Viper
От:
Зарегистрирован: 2006-11-08
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

matrix has python or python

xonix

w2n={}
n2w={}
# =>
w2n = n2w = {}
приводит к неожиданным последствиям:

>>> w2n = n2w = {}
>>> w2n = “a”
>>> n2w
{'a': ‘a’}



Отредактировано (Авг. 6, 2007 11:40:52)

Офлайн

#8 Авг. 6, 2007 14:04:51

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

matrix has python or python

нчиего неожиданного, просто оба объякта сысылаются на одни и теже данные

>>> x=y={}
>>> id(x), id(y)
(10342240, 10342240)
>>>

Офлайн

#9 Авг. 6, 2007 15:57:25

Viper
От:
Зарегистрирован: 2006-11-08
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

matrix has python or python

Ну неожиданным это может стать для новичка ;).

И данный пример после таких изменений корректно работать не будет.



Отредактировано (Авг. 6, 2007 15:58:45)

Офлайн

#10 Авг. 6, 2007 16:09:04

xonix
От:
Зарегистрирован: 2006-12-31
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

matrix has python or python

Viper
w2n={}
n2w={}
# =>
w2n = n2w = {}

приводит к неожиданным последствиям:
да, это верно, тут погорячился )



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version