Форум сайта python.su
всем доброго времени суток!
недавно возникла необходимость написать небольшую програмку, оперирующую с двухмерными массивами они же матрицы в пайтоне
в инете нарыл информацию что пайтон напрямую матрицы не поддерживает но это вроде можно сделать с помощью библиотек ScientificPython и numpy, но к сожаленью из мануалов не особо выяснил как их использовать и какая из этих библиотек нажна для реализации данного варианта т.к. в примерах рассматривалось их одновременное использование да и в далеких от матриц областях
если кто-то сталкивался с чем-то подобным с матрицами в пайтоне поделитесь опытами и если есть хоть небольшей кусочек кода иллюстрирующий такую работу…
Офлайн
В стандартном 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))
Отредактировано (Авг. 5, 2007 17:36:41)
Офлайн
Только то, что есть великолепные конструкции для списков:
вместо
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, если нужно).
То же есть и для генераторов. Часто нужны именно они, а не длинные списки.
Офлайн
@$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)
Офлайн
xonixприводит к неожиданным последствиям:
w2n={}
n2w={}
# =>
w2n = n2w = {}
Отредактировано (Авг. 6, 2007 11:40:52)
Офлайн
нчиего неожиданного, просто оба объякта сысылаются на одни и теже данные
>>> x=y={}
>>> id(x), id(y)
(10342240, 10342240)
>>>
Офлайн
Ну неожиданным это может стать для новичка ;).
И данный пример после таких изменений корректно работать не будет.
Отредактировано (Авг. 6, 2007 15:58:45)
Офлайн
Viperда, это верно, тут погорячился )
w2n={}
n2w={}
# =>
w2n = n2w = {}
приводит к неожиданным последствиям:
Офлайн