In [1]:
%matplotlib inline
from meme_wrapper import Meme
import logging

In [2]:
train = [
    ('ce1cg', 
     'TAATGTTTGTGCTGGTTTTTGTGGCATCGGGCGAGAATAGCGCGTGGTGTGAAAGACTGTTTTTTTGATCGTTTTCACAAAAATGGAAGTCCACAGTCTTGACAG'),
    ('ara', 
     'GACAAAAACGCGTAACAAAAGTGTCTATAATCACGGCAGAAAAGTCCACATTGATTATTTGCACGGCGTCACACTTTGCTATGCCATAGCATTTTTATCCATAAG'),
    ('bglr1', 
     'ACAAATCCCAATAACTTAATTATTGGGATTTGTTATATATAACTTTATAAATTCCTAAAATTACACAAAGTTAATAACTGTGAGCATGGTCATATTTTTATCAAT'),
    ('crp', 
     'CACAAAGCGAAAGCTATGCTAAAACAGTCAGGATGCTACAGTAATACATTGATGTACTGCATGTATGCAAAGGACGTCACATTACCGTGCAGTACAGTTGATAGC'),
    ('cya', 
     'ACGGTGCTACACTTGTATGTAGCGCATCTTTCTTTACGGTCAATCAGCAAGGTGTTAAATTGATCACGTTTTAGACCATTTTTTCGTCGTGAAACTAAAAAAACC'),
    ('deop2', 
     'AGTGAATTATTTGAACCAGATCGCATTACAGTGATGCAAACTTGTAAGTAGATTTCCTTAATTGTGATGTGTATCGAAGTGTGTTGCGGAGTAGATGTTAGAATA'),
    ('gale', 
     'GCGCATAAAAAACGGCTAAATTCTTGTGTAAACGATTCCACTAATTTATTCCATGTCACACTTTTCGCATCTTTGTTATGCTATGGTTATTTCATACCATAAGCC'),
    ('ilv', 
     'GCTCCGGCGGGGTTTTTTGTTATCTGCAATTCAGTACAAAACGTGATCAACCCCTCAATTTTCCCTTTGCTGAAAAATTTTCCATTGTCTCCCCTGTAAAGCTGT'),
    ('lac', 
     'AACGCAATTAATGTGAGTTAGCTCACTCATTAGGCACCCCAGGCTTTACACTTTATGCTTCCGGCTCGTATGTTGTGTGGAATTGTGAGCGGATAACAATTTCAC'),
    ('male', 
     'ACATTACCGCCAATTCTGTAACAGAGATCACACAAAGCGACGGTGGGGCGTAGGGGCAAGGAGGATGGAAAGAGGTTGCCGTATAAAGAAACTAGAGTCCGTTTA'),
    ('malk', 
     'GGAGGAGGCGGGAGGATGAGAACACGGCTTCTGTGAACTAAACCGAGGTCATGTAAGGAATTTCGTGATGTTGCTTGCAAAAATCGTGGCGATTTTATGTGCGCA'),
    ('malt', 
     'GATCAGCGTCGTTTTAGGTGAGTTGTTAATAAAGATTTGGAATTGTGACACAGTGCAAATTCAGACACATAAAAAAACGTCATCGCTTGCATTAGAAAGGTTTCT'),
    ('ompa', 
     'GCTGACAAAAAAGATTAAACATACCTTATACAAGACTTTTTTTTCATATGCCTGACGGAGTTCACACTTGTAAGTTTTCAACTACGTTGTAGACTTTACATCGCC'),
    ('tnaa', 
     'TTTTTTAAACATTAAAATTCTTACGTAATTTATAATCTTTAAAAAAAGCATTTAATATTGCTCCCCGAACGATTGTGATTCGATTCACATTTAAACAATTTCAGA'),
    ('uxu1', 
     'CCCATGAGAGTGAAATTGTTGTGATGTGGTTAACCCAATTAGAATTCGGGATTGACATGTCTTACCAAAAGGTAGAACTTATACGCCATCTCATCCGATGCAAGC'),
    ('pbr322', 
     'CTGGCTTAACTATGCGGCATCAGAGCAGATTGTACTGAGAGTGCACCATATGCGGTGTGAAATACCGCACAGATGCGTAAGGAGAAAATACCGCATCAGGCGCTC'),
    ('trn9cat', 
     'CTGTGACGGAAGATCACTTCGCAGAATAAATAAATCCTGGTGTCCCTGTTGATACCGGGAAGCCCTGGGCCAACTTTTGGCGAAAATGAGACGTTGATCGGCACG'),
    ('tdc', 
     'GATTTTTATACTTTAACTTGTTGATATTTAAAGGTATTTAATTGTAATAACGATACTCTGGAAAGTATTGAAAGTTAATTTGTGAGTGGTCGCACATATCCTGTT'),
    ]

# test data consists of first 9 sequences of training data
test = train[:9]

In [3]:
# saving data as fasta files
with open('seq18.fa','w') as f_train:
    for seq in train:
        f_train.write('>' + seq[0] + ' \n')
        f_train.write(seq[1] + '\n')
        
with open('seq9.fa','w') as f_test:
    for seq in test:
        f_test.write('>' + seq[0] + ' \n')
        f_test.write(seq[1] + '\n')

MEME Wrapper Example


In [4]:
# Meme().display_meme_help()
from eden.util import configure_logging
import logging
configure_logging(logging.getLogger(),verbosity=2)

In [5]:
from utilities import Weblogo
wl = Weblogo(color_scheme='classic')
meme1 = Meme(alphabet="dna",    # {ACGT}
             gap_in_alphabet=False,
             mod="anr",     # Any number of repititions
             output_dir="meme_anr", 
             nmotifs=3,    # Number of motives to be found
             
             weblogo_obj = wl
            )

meme1.fit(fasta_file="seq18.fa")


The output directory 'meme_anr' already exists.
Its contents will be overwritten.
Initializing the motif probability tables for 2 to 50 sites...
nsites = 50
Done initializing.
SEEDS: highwater mark: seq 17 pos 105

seqs=    18, min= 105, max=  105, total=     1890

motif=1
SEED WIDTHS: 8 11 15 21 29 41 50
em: w=  50, psites=  16, iter=   0 
motif=2
SEED WIDTHS: 8 11 15 21 29 41 50
em: w=  50, psites=  16, iter=   0 
motif=3
SEED WIDTHS: 8 11 15 21 29 41 50
em: w=  50, psites=  16, iter=   0 


In [6]:
predictions = meme1.predict(input_seqs=test, return_list=True)
for p in predictions: print p


[0, 1, 2]
[0, 1]
[0]
[0]
[0]
[0]
[0, 0, 1]
[0]
[0, 2]

In [7]:
predictions = meme1.predict(input_seqs="seq9.fa", return_list=False)
for p in predictions: print p


3
2
1
1
1
1
3
1
2

In [8]:
match = meme1.transform(input_seqs=test, return_match=True)
for m in match: print m


[[(64, 83, 8.78949776345788e-07)], [(30, 44, 0.0008573388203017831)], [(91, 105, 0.125)]]
[[(58, 77, 5.4842034364432564e-08)], [(36, 50, 0.000285779606767261)], []]
[[(79, 98, 1.7480898453662876e-07)], [], []]
[[(66, 85, 7.731576313195523e-08)], [], []]
[[(53, 72, 6.40325950683622e-08)], [], []]
[[(10, 29, 5.043839197613452e-07)], [], []]
[[(27, 46, 8.238203820897798e-08), (54, 73, 1.180518625128653e-08)], [(3, 17, 0.0004572473708276176)], []]
[[(42, 61, 6.830143473958632e-09)], [], []]
[[(12, 31, 8.324237358887084e-07)], [], [(37, 51, 0.125)]]

In [9]:
match = meme1.transform(input_seqs=test, return_match=False)
for m in match: print m


[1, 1, 1]
[1, 1, 0]
[1, 0, 0]
[1, 0, 0]
[1, 0, 0]
[1, 0, 0]
[1, 1, 0]
[1, 0, 0]
[1, 0, 1]

E-value of each motif


In [10]:
print meme1.e_values


[1.4e-05, 310.0, 1300.0]

fit_predict() and fit_transform() example


In [11]:
meme2 = Meme(alphabet="dna", mod="anr", nmotifs=3)

In [12]:
predictions = meme2.fit_predict(fasta_file="seq18.fa", return_list=True)
for p in predictions: print p


The output directory 'meme_out' already exists.
Its contents will be overwritten.
Initializing the motif probability tables for 2 to 50 sites...
nsites = 50
Done initializing.
SEEDS: highwater mark: seq 17 pos 105

seqs=    18, min= 105, max=  105, total=     1890

motif=1
SEED WIDTHS: 8 11 15 21 29 41 50
em: w=  50, psites=  16, iter=   0 
motif=2
SEED WIDTHS: 8 11 15 21 29 41 50
em: w=  50, psites=  16, iter=   0 
motif=3
SEED WIDTHS: 8 11 15 21 29 41 50
em: w=  50, psites=  16, iter=   0 

[0, 1, 2]
[0, 1]
[0]
[0]
[0]
[0]
[0, 0, 1]
[0]
[0, 2]
[0]
[0, 1]
[0]
[0]
[0]
[0]
[0, 1]
[1]
[0]

In [13]:
matches = meme2.fit_transform(fasta_file="seq18.fa", return_match=True)
for m in matches: print m


The output directory 'meme_out' already exists.
Its contents will be overwritten.
Initializing the motif probability tables for 2 to 50 sites...
nsites = 50
Done initializing.
SEEDS: highwater mark: seq 17 pos 105

seqs=    18, min= 105, max=  105, total=     1890

motif=1
SEED WIDTHS: 8 11 15 21 29 41 50
em: w=  50, psites=  16, iter=   0 
motif=2
SEED WIDTHS: 8 11 15 21 29 41 50
em: w=  50, psites=  16, iter=   0 
motif=3
SEED WIDTHS: 8 11 15 21 29 41 50
em: w=  50, psites=  16, iter=   0 

[[(64, 83, 8.78949776345788e-07)], [(30, 44, 0.0008573388203017831)], [(91, 105, 0.125)]]
[[(58, 77, 5.4842034364432564e-08)], [(36, 50, 0.000285779606767261)], []]
[[(79, 98, 1.7480898453662876e-07)], [], []]
[[(66, 85, 7.731576313195523e-08)], [], []]
[[(53, 72, 6.40325950683622e-08)], [], []]
[[(10, 29, 5.043839197613452e-07)], [], []]
[[(27, 46, 8.238203820897798e-08), (54, 73, 1.180518625128653e-08)], [(3, 17, 0.0004572473708276176)], []]
[[(42, 61, 6.830143473958632e-09)], [], []]
[[(12, 31, 8.324237358887084e-07)], [], [(37, 51, 0.125)]]
[[(17, 36, 1.369133305461708e-06)], [], []]
[[(64, 83, 8.408320564532407e-09)], [(15, 29, 0.00019051973784484067)], []]
[[(44, 63, 3.42283326365427e-08)], [], []]
[[(51, 70, 3.2631010446837377e-07)], [], []]
[[(74, 93, 9.668447539803668e-07)], [], []]
[[(20, 39, 1.9619414650575618e-08)], [], []]
[[(56, 75, 3.9842503598092026e-07)], [(81, 95, 0.010288065843621397)], []]
[[], [(79, 93, 0.00021433470507544578)], []]
[[(81, 100, 5.949813870648408e-07)], [], []]

Print motives as lists


In [14]:
#printing motives as lists
for motif in meme1.motives_list:
    for m in motif:
        print m
    print


('male', 'TGTAACAGAGATCACACAA')
('ompa', 'CCTGACGGAGTTCACACTT')
('lac', 'TGTGAGTTAGCTCACTCAT')
('tdc', 'TGTGAGTGGTCGCACATAT')
('pbr322', 'TGTGAAATACCGCACAGAT')
('tnaa', 'TGTGATTCGATTCACATTT')
('deop2', 'TTTGAACCAGATCGCATTA')
('ce1cg', 'TTTGATCGTTTTCACAAAA')
('ara', 'TTTGCACGGCGTCACACTT')
('bglr1', 'TGTGAGCATGGTCATATTT')
('crp', 'TGCAAAGGACGTCACATTA')
('malt', 'TGTGACACAGTGCAAATTC')
('gale', 'TGTAAACGATTCCACTAAT')
('cya', 'TGTTAAATTGATCACGTTT')
('uxu1', 'TGTGATGTGGTTAACCCAA')
('ilv', 'CGTGATCAACCCCTCAATT')
('gale', 'TGTCACACTTTTCGCATCT')
('malk', 'CGTGATGTTGCTTGCAAAA')

('pbr322', 'GGAGAAAATACCGC')
('ce1cg', 'GGCGAGAATAGCGC')
('gale', 'GCATAAAAAACGGC')
('malk', 'GATGAGAACACGGC')
('ara', 'GCAGAAAAGTCCAC')
('trn9cat', 'GGCGAAAATGAGAC')

('lac', 'CCCCAGGCTTTACA')
('ce1cg', 'CCACAGTCTTGACA')

Display Sequence logo of un-aligned motives


In [15]:
meme1.display_logo(do_alignment=False)


Display Logo of specified motif


In [16]:
meme1.display_logo(motif_num=1)


Multiple Sequence Alignment of motives with Muscle

Note: Motives in this example were already aligned, hence no dashes appear in the alignment


In [17]:
meme1.align_motives()    #MSA with Muscle
motives1=meme1.aligned_motives_list
for m in motives1:
    for i in m:
        print i
    print


('male', 'TGTAACAGAGATCACACAA')
('ompa', 'CCTGACGGAGTTCACACTT')
('lac', 'TGTGAGTTAGCTCACTCAT')
('tdc', 'TGTGAGTGGTCGCACATAT')
('pbr322', 'TGTGAAATACCGCACAGAT')
('tnaa', 'TGTGATTCGATTCACATTT')
('deop2', 'TTTGAACCAGATCGCATTA')
('ce1cg', 'TTTGATCGTTTTCACAAAA')
('ara', 'TTTGCACGGCGTCACACTT')
('bglr1', 'TGTGAGCATGGTCATATTT')
('crp', 'TGCAAAGGACGTCACATTA')
('malt', 'TGTGACACAGTGCAAATTC')
('gale', 'TGTAAACGATTCCACTAAT')
('cya', 'TGTTAAATTGATCACGTTT')
('uxu1', 'TGTGATGTGGTTAACCCAA')
('ilv', 'CGTGATCAACCCCTCAATT')
('gale', 'TGTCACACTTTTCGCATCT')
('malk', 'CGTGATGTTGCTTGCAAAA')

('pbr322', 'GGAGAAAATACCGC')
('ce1cg', 'GGCGAGAATAGCGC')
('gale', 'GCATAAAAAACGGC')
('malk', 'GATGAGAACACGGC')
('ara', 'GCAGAAAAGTCCAC')
('trn9cat', 'GGCGAAAATGAGAC')

('lac', 'CCCCAGGCTTTACA')
('ce1cg', 'CCACAGTCTTGACA')

Display sequence logo of aligned motives


In [18]:
meme1.display_logo(do_alignment=True)


Position Weight Matrices for motifs


In [44]:
meme1.display()


        0      1      2      3      4      5      6      7      8      9     10     11     12     13     14     15     16     17     18
A:   0.05   0.05   0.05   0.18   0.82   0.32   0.27   0.14   0.45   0.09   0.18   0.05   0.09   0.68   0.09   0.68   0.23   0.41   0.32
C:   0.18   0.09   0.09   0.09   0.09   0.23   0.32   0.23   0.05   0.23   0.27   0.14   0.77   0.05   0.77   0.09   0.27   0.09   0.09
G:   0.05   0.68   0.05   0.64   0.05   0.18   0.23   0.36   0.23   0.45   0.18   0.18   0.05   0.18   0.05   0.09   0.09   0.05   0.05
T:   0.73   0.18   0.82   0.09   0.05   0.27   0.18   0.27   0.27   0.23   0.36   0.64   0.09   0.09   0.09   0.14   0.41   0.45   0.55

        0      1      2      3      4      5      6      7      8      9     10     11     12     13
A:   0.10   0.20   0.40   0.10   0.70   0.50   0.70   0.70   0.20   0.50   0.20   0.10   0.30   0.10
C:   0.10   0.30   0.30   0.10   0.10   0.10   0.10   0.10   0.20   0.10   0.50   0.40   0.10   0.70
G:   0.70   0.40   0.10   0.60   0.10   0.30   0.10   0.10   0.20   0.20   0.20   0.40   0.50   0.10
T:   0.10   0.10   0.20   0.20   0.10   0.10   0.10   0.10   0.40   0.20   0.10   0.10   0.10   0.10

        0      1      2      3      4      5      6      7      8      9     10     11     12     13
A:   0.17   0.17   0.33   0.17   0.50   0.17   0.17   0.17   0.17   0.17   0.17   0.50   0.17   0.50
C:   0.50   0.50   0.33   0.50   0.17   0.17   0.17   0.50   0.17   0.17   0.17   0.17   0.50   0.17
G:   0.17   0.17   0.17   0.17   0.17   0.50   0.33   0.17   0.17   0.17   0.33   0.17   0.17   0.17
T:   0.17   0.17   0.17   0.17   0.17   0.17   0.33   0.17   0.50   0.50   0.33   0.17   0.17   0.17


In [20]:
meme1.matrix()


Out[20]:
[array([[ 0.        ,  0.        ,  0.        ,  0.16666667,  0.94444444,
          0.33333333,  0.27777778,  0.11111111,  0.5       ,  0.05555556,
          0.16666667,  0.        ,  0.05555556,  0.77777778,  0.05555556,
          0.77777778,  0.22222222,  0.44444444,  0.33333333],
        [ 0.16666667,  0.05555556,  0.05555556,  0.05555556,  0.05555556,
          0.22222222,  0.33333333,  0.22222222,  0.        ,  0.22222222,
          0.27777778,  0.11111111,  0.88888889,  0.        ,  0.88888889,
          0.05555556,  0.27777778,  0.05555556,  0.05555556],
        [ 0.        ,  0.77777778,  0.        ,  0.72222222,  0.        ,
          0.16666667,  0.22222222,  0.38888889,  0.22222222,  0.5       ,
          0.16666667,  0.16666667,  0.        ,  0.16666667,  0.        ,
          0.05555556,  0.05555556,  0.        ,  0.        ],
        [ 0.83333333,  0.16666667,  0.94444444,  0.05555556,  0.        ,
          0.27777778,  0.16666667,  0.27777778,  0.27777778,  0.22222222,
          0.38888889,  0.72222222,  0.05555556,  0.05555556,  0.05555556,
          0.11111111,  0.44444444,  0.5       ,  0.61111111]]),
 array([[ 0.        ,  0.16666667,  0.5       ,  0.        ,  1.        ,
          0.66666667,  1.        ,  1.        ,  0.16666667,  0.66666667,
          0.16666667,  0.        ,  0.33333333,  0.        ],
        [ 0.        ,  0.33333333,  0.33333333,  0.        ,  0.        ,
          0.        ,  0.        ,  0.        ,  0.16666667,  0.        ,
          0.66666667,  0.5       ,  0.        ,  1.        ],
        [ 1.        ,  0.5       ,  0.        ,  0.83333333,  0.        ,
          0.33333333,  0.        ,  0.        ,  0.16666667,  0.16666667,
          0.16666667,  0.5       ,  0.66666667,  0.        ],
        [ 0.        ,  0.        ,  0.16666667,  0.16666667,  0.        ,
          0.        ,  0.        ,  0.        ,  0.5       ,  0.16666667,
          0.        ,  0.        ,  0.        ,  0.        ]]),
 array([[ 0. ,  0. ,  0.5,  0. ,  1. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,
          1. ,  0. ,  1. ],
        [ 1. ,  1. ,  0.5,  1. ,  0. ,  0. ,  0. ,  1. ,  0. ,  0. ,  0. ,
          0. ,  1. ,  0. ],
        [ 0. ,  0. ,  0. ,  0. ,  0. ,  1. ,  0.5,  0. ,  0. ,  0. ,  0.5,
          0. ,  0. ,  0. ],
        [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0.5,  0. ,  1. ,  1. ,  0.5,
          0. ,  0. ,  0. ]])]

Display PWM of single motif


In [21]:
meme1.display(motif_num=3)


        0      1      2      3      4      5      6      7      8      9     10     11     12     13
A:   0.00   0.00   0.50   0.00   1.00   0.00   0.00   0.00   0.00   0.00   0.00   1.00   0.00   1.00
C:   1.00   1.00   0.50   1.00   0.00   0.00   0.00   1.00   0.00   0.00   0.00   0.00   1.00   0.00
G:   0.00   0.00   0.00   0.00   0.00   1.00   0.50   0.00   0.00   0.00   0.50   0.00   0.00   0.00
T:   0.00   0.00   0.00   0.00   0.00   0.00   0.50   0.00   1.00   1.00   0.50   0.00   0.00   0.00

Scoring a sequence w.r.t a motif


In [23]:
test_seq = 'GGAGAAAATACCGC' * 10
seq_score = meme1.score(motif_num=2, seq=test_seq)
print seq_score


[0.010288065843621397, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.010288065843621397, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.010288065843621397, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.010288065843621397, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.010288065843621397, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.010288065843621397, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.010288065843621397, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.010288065843621397, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.010288065843621397, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.010288065843621397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Transform with HMM as scoring criteria


In [5]:
meme2 = Meme(alphabet="dna", scoring_criteria="hmm", k=1, threshold=1.0,mod="anr", nmotifs=3, minw=7, maxw=9)
matches = meme2.fit_transform(fasta_file="seq9.fa", return_match=True)
for m in matches: print m


[[(75, 84, 1.149785137630629)], [(79, 88, 1.7480177623272883)], [(58, 67, 1.9982163169366849)]]
[[(1, 10, 1.149785137630629)], [(13, 22, 1.6640484225879693)], [(92, 101, 1.6588939715039304)]]
[[(57, 66, 1.149785137630629)], [(67, 76, 1.6861238904884241)], [(23, 32, 1.6227737703669607)]]
[[(4, 13, 1.149785137630629)], [(4, 13, 1.6699541402508258)], [(82, 91, 1.4225932893334565)]]
[[(92, 101, 1.3414159939024004)], [(93, 102, 1.7141308591011202)], [(79, 88, 1.9072646534741875)]]
[[], [(44, 53, 1.64194717163813)], [(79, 88, 1.689241125412223)]]
[[(4, 13, 1.3414159939024004)], [(4, 13, 1.7141308591011202)], [(21, 30, 1.8345901441201993)]]
[[(33, 42, 1.149785137630629)], [(71, 80, 1.6861238904884241)], [(13, 22, 1.9982163169366849)]]
[[], [(6, 15, 1.6301357363124165)], [(71, 80, 1.7801927888747202)]]

In [8]:
%%time
# Markov Model score
mm_score = meme2.score(motif_num=2, seq="ACGT"*10)
print mm_score


[-230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, -230.25850929940458, 0, 0, 0, 0, 0, 0, 0, 0]
CPU times: user 56 ms, sys: 8 ms, total: 64 ms
Wall time: 58.2 ms

In [ ]: