Hi,<br><br><div class="gmail_quote">On Tue, Jul 31, 2012 at 7:20 PM, Vlastimil Brom <span dir="ltr">&lt;<a href="mailto:vlastimil.brom@gmail.com" target="_blank">vlastimil.brom@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">2012/7/31 eat &lt;<a href="mailto:e.antero.tammi@gmail.com">e.antero.tammi@gmail.com</a>&gt;:<br>
&gt; Hi,<br>
&gt;<br>
&gt; On Tue, Jul 31, 2012 at 5:01 PM, Vlastimil Brom &lt;<a href="mailto:vlastimil.brom@gmail.com">vlastimil.brom@gmail.com</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; 2012/7/31 eat &lt;<a href="mailto:e.antero.tammi@gmail.com">e.antero.tammi@gmail.com</a>&gt;:<br>
&gt;&gt; &gt; Hi,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; On Tue, Jul 31, 2012 at 10:23 AM, Vlastimil Brom<br>
&gt;&gt; &gt; &lt;<a href="mailto:vlastimil.brom@gmail.com">vlastimil.brom@gmail.com</a>&gt;<br>
&gt;&gt; &gt; wrote:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; 2012/7/30 eat &lt;<a href="mailto:e.antero.tammi@gmail.com">e.antero.tammi@gmail.com</a>&gt;:<br>
&gt;&gt; &gt;&gt; &gt; Hi,<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; A partial answer to your questions:<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; On Mon, Jul 30, 2012 at 10:33 PM, Vlastimil Brom<br>
&gt;&gt; &gt;&gt; &gt; &lt;<a href="mailto:vlastimil.brom@gmail.com">vlastimil.brom@gmail.com</a>&gt;<br>
&gt;&gt; &gt;&gt; &gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; Hi all,<br>
&gt;&gt; &gt;&gt; &gt;&gt; I&#39;d like to ask for some hints or advice regarding the usage of<br>
&gt;&gt; &gt;&gt; &gt;&gt; numpy.array and especially  slicing.<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; I only recently tried numpy and was impressed by the speedup in some<br>
&gt;&gt; &gt;&gt; &gt;&gt; parts of the code, hence I suspect, that I might miss some other<br>
&gt;&gt; &gt;&gt; &gt;&gt; oportunities in this area.<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; I currently use the following code for a simple visualisation of the<br>
&gt;&gt; &gt;&gt; &gt;&gt; search matches within the text, the arrays are generally much larger<br>
&gt;&gt; &gt;&gt; &gt;&gt; than the sample - the texts size is generally hundreds of kilobytes<br>
&gt;&gt; &gt;&gt; &gt;&gt; up<br>
&gt;&gt; &gt;&gt; &gt;&gt; to a few MB - with an index position for each character.<br>
&gt;&gt; &gt;&gt; &gt;&gt; First there is a list of spans(obtained form the regex match<br>
&gt;&gt; &gt;&gt; &gt;&gt; objects),<br>
&gt;&gt; &gt;&gt; &gt;&gt; the respective character indices in between these slices should be<br>
&gt;&gt; &gt;&gt; &gt;&gt; set<br>
&gt;&gt; &gt;&gt; &gt;&gt; to 1:<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; import numpy<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; characters_matches = numpy.zeros(10)<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; matches_spans = numpy.array([[2,4], [5,9]])<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; for start, stop in matches_spans:<br>
&gt;&gt; &gt;&gt; &gt;&gt; ...     characters_matches[start:stop] = 1<br>
&gt;&gt; &gt;&gt; &gt;&gt; ...<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; characters_matches<br>
&gt;&gt; &gt;&gt; &gt;&gt; array([ 0.,  0.,  1.,  1.,  0.,  1.,  1.,  1.,  1.,  0.])<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; Is there maybe a way tu achieve this in a numpy-only way - without<br>
&gt;&gt; &gt;&gt; &gt;&gt; the<br>
&gt;&gt; &gt;&gt; &gt;&gt; python loop?<br>
&gt;&gt; &gt;&gt; &gt;&gt; (I got the impression, the powerful slicing capabilities could make<br>
&gt;&gt; &gt;&gt; &gt;&gt; it<br>
&gt;&gt; &gt;&gt; &gt;&gt; possible, bud haven&#39;t found this kind of solution.)<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; In the next piece of code all the character positions are evaluated<br>
&gt;&gt; &gt;&gt; &gt;&gt; with their &quot;neighbourhood&quot; and a kind of running proportions of the<br>
&gt;&gt; &gt;&gt; &gt;&gt; matched text parts are computed (the checks_distance could be<br>
&gt;&gt; &gt;&gt; &gt;&gt; generally up to the order of the half the text length, usually less<br>
&gt;&gt; &gt;&gt; &gt;&gt; :<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; check_distance = 1<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; floating_checks_proportions = []<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; for i in numpy.arange(len(characters_matches)):<br>
&gt;&gt; &gt;&gt; &gt;&gt; ...     lo = i - check_distance<br>
&gt;&gt; &gt;&gt; &gt;&gt; ...     if lo &lt; 0:<br>
&gt;&gt; &gt;&gt; &gt;&gt; ...         lo = None<br>
&gt;&gt; &gt;&gt; &gt;&gt; ...     hi = i + check_distance + 1<br>
&gt;&gt; &gt;&gt; &gt;&gt; ...     checked_sublist = characters_matches[lo:hi]<br>
&gt;&gt; &gt;&gt; &gt;&gt; ...     proportion = (checked_sublist.sum() / (check_distance * 2 +<br>
&gt;&gt; &gt;&gt; &gt;&gt; 1.0))<br>
&gt;&gt; &gt;&gt; &gt;&gt; ...     floating_checks_proportions.append(proportion)<br>
&gt;&gt; &gt;&gt; &gt;&gt; ...<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt; floating_checks_proportions<br>
&gt;&gt; &gt;&gt; &gt;&gt; [0.0, 0.33333333333333331, 0.66666666666666663, 0.66666666666666663,<br>
&gt;&gt; &gt;&gt; &gt;&gt; 0.66666666666666663, 0.66666666666666663, 1.0, 1.0,<br>
&gt;&gt; &gt;&gt; &gt;&gt; 0.66666666666666663, 0.33333333333333331]<br>
&gt;&gt; &gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; Define a function for proportions:<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; from numpy import r_<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; from numpy.lib.stride_tricks import as_strided as ast<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; def proportions(matches, distance= 1):<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;     cd, cd2p1, s= distance, 2* distance+ 1, matches.strides[0]<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;     # pad<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;     m= r_[[0.]* cd, matches, [0.]* cd]<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;     # create a suitable view<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;     m= ast(m, shape= (m.shape[0], cd2p1), strides= (s, s))<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;     # average<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;     return m[:-2* cd].sum(1)/ cd2p1<br>
&gt;&gt; &gt;&gt; &gt; and use it like:<br>
&gt;&gt; &gt;&gt; &gt; In []: matches<br>
&gt;&gt; &gt;&gt; &gt; Out[]: array([ 0.,  0.,  1.,  1.,  0.,  1.,  1.,  1.,  1.,  0.])<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; In []: proportions(matches).round(2)<br>
&gt;&gt; &gt;&gt; &gt; Out[]: array([ 0.  ,  0.33,  0.67,  0.67,  0.67,  0.67,  1.  ,  1.  ,<br>
&gt;&gt; &gt;&gt; &gt; 0.67,<br>
&gt;&gt; &gt;&gt; &gt; 0.33])<br>
&gt;&gt; &gt;&gt; &gt; In []: proportions(matches, 5).round(2)<br>
&gt;&gt; &gt;&gt; &gt; Out[]: array([ 0.27,  0.36,  0.45,  0.55,  0.55,  0.55,  0.55,  0.55,<br>
&gt;&gt; &gt;&gt; &gt; 0.45,<br>
&gt;&gt; &gt;&gt; &gt; 0.36])<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; I&#39;d like to ask about the possible better approaches, as it doesn&#39;t<br>
&gt;&gt; &gt;&gt; &gt;&gt; look very elegant to me, and I obviously don&#39;t know the implications<br>
&gt;&gt; &gt;&gt; &gt;&gt; or possible drawbacks of numpy arrays in some scenarios.<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; the pattern<br>
&gt;&gt; &gt;&gt; &gt;&gt; for i in range(len(...)): is usually considered inadequate in<br>
&gt;&gt; &gt;&gt; &gt;&gt; python,<br>
&gt;&gt; &gt;&gt; &gt;&gt; but what should be used in this case as the indices are primarily<br>
&gt;&gt; &gt;&gt; &gt;&gt; needed?<br>
&gt;&gt; &gt;&gt; &gt;&gt; is something to be gained or lost using (x)range or np.arange as the<br>
&gt;&gt; &gt;&gt; &gt;&gt; python loop is (probably?) inevitable anyway?<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; Here np.arange(.) will create a new array and potentially wasting<br>
&gt;&gt; &gt;&gt; &gt; memory<br>
&gt;&gt; &gt;&gt; &gt; if<br>
&gt;&gt; &gt;&gt; &gt; it&#39;s not otherwise used. IMO nothing wrong looping with xrange(.) (if<br>
&gt;&gt; &gt;&gt; &gt; you<br>
&gt;&gt; &gt;&gt; &gt; really need to loop ;).<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; Is there some mor elegant way to check for the &quot;underflowing&quot; lower<br>
&gt;&gt; &gt;&gt; &gt;&gt; bound &quot;lo&quot; to replace with None?<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; Is it significant, which container is used to collect the results of<br>
&gt;&gt; &gt;&gt; &gt;&gt; the computation in the python loop - i.e. python list or a numpy<br>
&gt;&gt; &gt;&gt; &gt;&gt; array?<br>
&gt;&gt; &gt;&gt; &gt;&gt; (Could possibly matplotlib cooperate better with either container?)<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; And of course, are there maybe other things, which should be made<br>
&gt;&gt; &gt;&gt; &gt;&gt; better/differently?<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; (using Numpy 1.6.2, python 2.7.3, win XP)<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; My 2 cents,<br>
&gt;&gt; &gt;&gt; &gt; -eat<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; Thanks in advance for any hints or suggestions,<br>
&gt;&gt; &gt;&gt; &gt;&gt;    regards,<br>
&gt;&gt; &gt;&gt; &gt;&gt;   Vlastimil Brom<br>
&gt;&gt; &gt;&gt; &gt;&gt; _______________________________________________<br>
&gt;&gt; &gt;&gt; &gt;&gt; NumPy-Discussion mailing list<br>
&gt;&gt; &gt;&gt; &gt;&gt; <a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
&gt;&gt; &gt;&gt; &gt;&gt; <a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion" target="_blank">http://mail.scipy.org/mailman/listinfo/numpy-discussion</a><br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; Hi,<br>
&gt;&gt; &gt;&gt; thank you very much for your suggestions!<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; do I understand it correctly, that I have to special-case the function<br>
&gt;&gt; &gt;&gt; for distance = 0 (which should return the matches themselves without<br>
&gt;&gt; &gt;&gt; recalculation)?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Yes.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; However, more importantly, I am getting a ValueError for some larger,<br>
&gt;&gt; &gt;&gt; (but not completely unreasonable) &quot;distance&quot;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt;&gt; proportions(matches, distance= 8190)<br>
&gt;&gt; &gt;&gt; Traceback (most recent call last):<br>
&gt;&gt; &gt;&gt;   File &quot;&lt;input&gt;&quot;, line 1, in &lt;module&gt;<br>
&gt;&gt; &gt;&gt;   File &quot;&lt;input&gt;&quot;, line 11, in proportions<br>
&gt;&gt; &gt;&gt;   File &quot;C:\Python27\lib\site-packages\numpy\lib\stride_tricks.py&quot;,<br>
&gt;&gt; &gt;&gt; line 28, in as_strided<br>
&gt;&gt; &gt;&gt;     return np.asarray(DummyArray(interface, base=x))<br>
&gt;&gt; &gt;&gt;   File &quot;C:\Python27\lib\site-packages\numpy\core\numeric.py&quot;, line<br>
&gt;&gt; &gt;&gt; 235, in asarray<br>
&gt;&gt; &gt;&gt;     return array(a, dtype, copy=False, order=order)<br>
&gt;&gt; &gt;&gt; ValueError: array is too big.<br>
&gt;&gt; &gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; the distance= 8189 was the largest which worked in this snippet,<br>
&gt;&gt; &gt;&gt; however, it might be data-dependent, as I got this error as well e.g.<br>
&gt;&gt; &gt;&gt; for distance=4529 for a 20k text.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Is this implementation-limited, or could it be solved in some<br>
&gt;&gt; &gt;&gt; alternative way which wouldn&#39;t have such limits (up to the order of,<br>
&gt;&gt; &gt;&gt; say, millions)?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Apparently ast(.) does not return a view of the original matches rather<br>
&gt;&gt; &gt; a<br>
&gt;&gt; &gt; copy of size (n* (2* distance+ 1)), thus you may run out of memory.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Surely it can be solved up to millions of matches, but perhaps much<br>
&gt;&gt; &gt; slower<br>
&gt;&gt; &gt; speed.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Regards,<br>
&gt;&gt; &gt; -eat<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Thanks again<br>
&gt;&gt; &gt;&gt;   regards<br>
&gt;&gt; &gt;&gt;     vbr<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; _______________________________________________<br>
&gt;&gt; &gt;&gt; NumPy-Discussion mailing list<br>
&gt;&gt; &gt;&gt; <a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
&gt;&gt; &gt;&gt; <a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion" target="_blank">http://mail.scipy.org/mailman/listinfo/numpy-discussion</a><br>
&gt;&gt; &gt;<br>
&gt;&gt;<br>
&gt;&gt; Thank you for the confirmation,<br>
&gt;&gt; I&#39;ll wait and see, whether the current speed isn&#39;t actually already<br>
&gt;&gt; acceptable for the most cases...<br>
&gt;&gt; I could already gain a speedup by using the array.sum()  and other<br>
&gt;&gt; features, maybe I will find yet other possibilities.<br>
&gt;<br>
&gt; I just cooked up some pure pyhton and running sum based solution, which<br>
&gt; actually may be faster and it scales quite well up to millions of matches:<br>
&gt;<br>
&gt; def proportions_p(matches, distance= 1):<br>
&gt;<br>
&gt;     cd, cd2p1= distance, 2* distance+ 1<br>
&gt;<br>
&gt;     m, r= [0]* cd+ matches+ [0]* (cd+ 1), [0]* len(matches)<br>
&gt;<br>
&gt;     s= sum(m[:cd2p1])<br>
&gt;<br>
&gt;     for k in xrange(len(matches)):<br>
&gt;<br>
&gt;         r[k]= s/ cd2p1<br>
&gt;<br>
&gt;         s-= m[k]<br>
&gt;<br>
&gt;         s+= m[cd2p1+ k]<br>
&gt;<br>
&gt;     return r<br>
&gt;<br>
&gt;<br>
&gt; Some verification and timings:<br>
&gt; In []: a= arange(1, 100000, dtype= float)<br>
&gt; In []: allclose(proportions(a, 1000), proportions_p(a.tolist(), 1000))<br>
&gt; Out[]: True<br>
&gt;<br>
&gt; In []: %timeit proportions(a, 1000)<br>
&gt; 1 loops, best of 3: 288 ms per loop<br>
&gt; In []: %timeit proportions_p(a.tolist(), 1000)<br>
&gt; 10 loops, best of 3: 66.2 ms per loop<br>
&gt;<br>
&gt; In []: a= arange(1, 1000000, dtype= float)<br>
&gt; In []: %timeit proportions(a, 10000)<br>
&gt; ------------------------------------------------------------<br>
&gt; Traceback (most recent call last):<br>
&gt; [snip]<br>
&gt; ValueError: array is too big.<br>
&gt;<br>
&gt; In []: %timeit proportions_p(a.tolist(), 10000)<br>
&gt; 1 loops, best of 3: 680 ms per loop<br>
&gt;<br>
&gt;<br>
&gt; Regards,<br>
&gt; -eat<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; regards,<br>
&gt;&gt;<br>
&gt;&gt;     vbr<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; NumPy-Discussion mailing list<br>
&gt;&gt; <a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
&gt;&gt; <a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion" target="_blank">http://mail.scipy.org/mailman/listinfo/numpy-discussion</a><br>
&gt;<br>
&gt;<br>
</div></div>Thanks for further assistance;<br>
I hope, I am not misunderstanding something in the code, but this<br>
calculation of proportions is supposed to be run over an array of<br>
either 0 or 1, rather than a range;<br>
a test data would be something like:<br></blockquote><div>It really shouldn&#39;t matter what the test case numbers are. We are just calculating averages over of certain &#39;window&#39;, like:</div><div><div><font face="courier new, monospace">In []: proportions(arange(1, 4, dtype= float))</font></div>
<div><font face="courier new, monospace">Out[]: array([ 1.        ,  2.        ,  1.66666667])</font></div><div><font face="courier new, monospace">In []: (0.+ 1.+ 2.)/ 3</font></div><div><font face="courier new, monospace">Out[]: 1.0</font></div>
<div><font face="courier new, monospace">In []: (1.+ 2.+ 3.)/ 3</font></div><div><font face="courier new, monospace">Out[]: 2.0</font></div><div><font face="courier new, monospace">In []: (2.+ 3.+ 0.)/ 3</font></div><div>
<font face="courier new, monospace">Out[]: 1.6666666666666667</font></div></div><div><br></div><div><br></div><div>Regards,</div><div>-eat </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
import random<br>
test_lst = [0,1]*500<br>
random.shuffle(test_lst)<br>
<br>
For this data, I am not getting the same results like with my<br>
previously posted python function.<br>
<br>
Thanks and regards<br>
<div class="HOEnZb"><div class="h5"> vbr<br>
_______________________________________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
<a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion" target="_blank">http://mail.scipy.org/mailman/listinfo/numpy-discussion</a><br>
</div></div></blockquote></div><br>