Найти - Пользователи
Полная версия: matrix has python or python
Начало » Python для экспертов » matrix has python or python
1 2
rasser_depressnjak
всем доброго времени суток!
недавно возникла необходимость написать небольшую програмку, оперирующую с двухмерными массивами они же матрицы в пайтоне
в инете нарыл информацию что пайтон напрямую матрицы не поддерживает но это вроде можно сделать с помощью библиотек ScientificPython и numpy, но к сожаленью из мануалов не особо выяснил как их использовать и какая из этих библиотек нажна для реализации данного варианта т.к. в примерах рассматривалось их одновременное использование да и в далеких от матриц областях
если кто-то сталкивался с чем-то подобным с матрицами в пайтоне поделитесь опытами и если есть хоть небольшей кусочек кода иллюстрирующий такую работу…
j2a
В стандартном Python двумерные массивы есть. Матричных операций нет. Какие конкретно операции с данными нужны?
nss
http://www.scipy.org/Documentation
$m1t
Вот немного моего кода - может чем поможет
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. Выскажите критику по коду, если можно - что пишу косо и что можно писать лучше?
Андрей Светлов
Только то, что есть великолепные конструкции для списков:

вместо
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, если нужно).

То же есть и для генераторов. Часто нужны именно они, а не длинные списки.
xonix
@$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)
Viper
xonix

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

>>> w2n = n2w = {}
>>> w2n = “a”
>>> n2w
{'a': ‘a’}
slav0nic
нчиего неожиданного, просто оба объякта сысылаются на одни и теже данные

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

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

И данный пример после таких изменений корректно работать не будет.
xonix
Viper
w2n={}
n2w={}
# =>
w2n = n2w = {}

приводит к неожиданным последствиям:
да, это верно, тут погорячился )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB