I&#39;m on Windows, using a precompiled binary. I never built numpy/scipy on Windows.<br><br><div class="gmail_quote">On Wed, Jun 2, 2010 at 10:45 AM, Wes McKinney <span dir="ltr">&lt;<a href="mailto:wesmckinn@gmail.com">wesmckinn@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><div></div><div class="h5">On Wed, Jun 2, 2010 at 1:23 PM, Mathew Yeates &lt;<a href="mailto:mat.yeates@gmail.com">mat.yeates@gmail.com</a>&gt; wrote:<br>

&gt; thanks. I am also getting an error in ndi.mean<br>
&gt; Were you getting the error<br>
&gt; &quot;RuntimeError: data type not supported&quot;?<br>
&gt;<br>
&gt; -Mathew<br>
&gt;<br>
&gt; On Wed, Jun 2, 2010 at 9:40 AM, Wes McKinney &lt;<a href="mailto:wesmckinn@gmail.com">wesmckinn@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; On Wed, Jun 2, 2010 at 3:41 AM, Vincent Schut &lt;<a href="mailto:schut@sarvision.nl">schut@sarvision.nl</a>&gt; wrote:<br>
&gt;&gt; &gt; On 06/02/2010 04:52 AM, <a href="mailto:josef.pktd@gmail.com">josef.pktd@gmail.com</a> wrote:<br>
&gt;&gt; &gt;&gt; On Tue, Jun 1, 2010 at 9:57 PM, Zachary Pincus&lt;<a href="mailto:zachary.pincus@yale.edu">zachary.pincus@yale.edu</a>&gt;<br>
&gt;&gt; &gt;&gt;  wrote:<br>
&gt;&gt; &gt;&gt;&gt;&gt; I guess it&#39;s as fast as I&#39;m going to get. I don&#39;t really see any<br>
&gt;&gt; &gt;&gt;&gt;&gt; other way. BTW, the lat/lons are integers)<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; You could (in c or cython) try a brain-dead &quot;hashtable&quot; with no<br>
&gt;&gt; &gt;&gt;&gt; collision detection:<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; for lat, long, data in dataset:<br>
&gt;&gt; &gt;&gt;&gt;    bin = (lat ^ long) % num_bins<br>
&gt;&gt; &gt;&gt;&gt;    hashtable[bin] = update_incremental_mean(hashtable[bin], data)<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; you&#39;ll of course want to do some experiments to see if your data are<br>
&gt;&gt; &gt;&gt;&gt; sufficiently sparse and/or you can afford a large enough hashtable<br>
&gt;&gt; &gt;&gt;&gt; array that you won&#39;t get spurious hash collisions. Adding error-<br>
&gt;&gt; &gt;&gt;&gt; checking to ensure that there are no collisions would be pretty<br>
&gt;&gt; &gt;&gt;&gt; trivial (just keep a table of the lat/long for each hash value, which<br>
&gt;&gt; &gt;&gt;&gt; you&#39;ll need anyway, and check that different lat/long pairs don&#39;t get<br>
&gt;&gt; &gt;&gt;&gt; assigned the same bin).<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; Zach<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; -Mathew<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; On Tue, Jun 1, 2010 at 1:49 PM, Zachary<br>
&gt;&gt; &gt;&gt;&gt;&gt; Pincus&lt;<a href="mailto:zachary.pincus@yale.edu">zachary.pincus@yale.edu</a><br>
&gt;&gt; &gt;&gt;&gt;&gt;&gt; wrote:<br>
&gt;&gt; &gt;&gt;&gt;&gt;&gt; Hi<br>
&gt;&gt; &gt;&gt;&gt;&gt;&gt; Can anyone think of a clever (non-lopping) solution to the<br>
&gt;&gt; &gt;&gt;&gt;&gt; following?<br>
&gt;&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt;&gt; A have a list of latitudes, a list of longitudes, and list of data<br>
&gt;&gt; &gt;&gt;&gt;&gt;&gt; values. All lists are the same length.<br>
&gt;&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt;&gt; I want to compute an average  of data values for each lat/lon pair.<br>
&gt;&gt; &gt;&gt;&gt;&gt;&gt; e.g. if lat[1001] lon[1001] = lat[2001] [lon [2001] then<br>
&gt;&gt; &gt;&gt;&gt;&gt;&gt; data[1001] = (data[1001] + data[2001])/2<br>
&gt;&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt;&gt; Looping is going to take wayyyy to long.<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; As a start, are the &quot;equal&quot; lat/lon pairs exactly equal (i.e. either<br>
&gt;&gt; &gt;&gt;&gt;&gt; not floating-point, or floats that will always compare equal, that<br>
&gt;&gt; &gt;&gt;&gt;&gt; is,<br>
&gt;&gt; &gt;&gt;&gt;&gt; the floating-point bit-patterns will be guaranteed to be identical)<br>
&gt;&gt; &gt;&gt;&gt;&gt; or<br>
&gt;&gt; &gt;&gt;&gt;&gt; approximately equal to float tolerance?<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; If you&#39;re in the approx-equal case, then look at the KD-tree in scipy<br>
&gt;&gt; &gt;&gt;&gt;&gt; for doing near-neighbors queries.<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; If you&#39;re in the exact-equal case, you could consider hashing the<br>
&gt;&gt; &gt;&gt;&gt;&gt; lat/<br>
&gt;&gt; &gt;&gt;&gt;&gt; lon pairs or something. At least then the looping is O(N) and not<br>
&gt;&gt; &gt;&gt;&gt;&gt; O(N^2):<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; import collections<br>
&gt;&gt; &gt;&gt;&gt;&gt; grouped = collections.defaultdict(list)<br>
&gt;&gt; &gt;&gt;&gt;&gt; for lt, ln, da in zip(lat, lon, data):<br>
&gt;&gt; &gt;&gt;&gt;&gt;    grouped[(lt, ln)].append(da)<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; averaged = dict((ltln, numpy.mean(da)) for ltln, da in<br>
&gt;&gt; &gt;&gt;&gt;&gt; grouped.items())<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Is that fast enough?<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; If the lat lon can be converted to a 1d label as Wes suggested, then<br>
&gt;&gt; &gt;&gt; in a similar timing exercise ndimage was the fastest.<br>
&gt;&gt; &gt;&gt; <a href="http://mail.scipy.org/pipermail/scipy-user/2009-February/019850.html" target="_blank">http://mail.scipy.org/pipermail/scipy-user/2009-February/019850.html</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; And as you said your lats and lons are integers, you could simply do<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ll = lat*1000 + lon<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; to get unique &#39;hashes&#39; or &#39;1d labels&#39; for you latlon pairs, as a lat or<br>
&gt;&gt; &gt; lon will never exceed 360 (degrees).<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; After that, either use the ndimage approach, or you could use<br>
&gt;&gt; &gt; histogramming with weighting by data values and divide by histogram<br>
&gt;&gt; &gt; withouth weighting, or just loop.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Vincent<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; (this was for python 2.4, also later I found np.bincount which<br>
&gt;&gt; &gt;&gt; requires that the labels are consecutive integers, but is as fast as<br>
&gt;&gt; &gt;&gt; ndimage)<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; I don&#39;t know how it would compare to the new suggestions.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Josef<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Zach<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;&gt;<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;&gt; _______________________________________________<br>
&gt;&gt; &gt;&gt;&gt; NumPy-Discussion mailing list<br>
&gt;&gt; &gt;&gt;&gt; <a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
&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;<br>
&gt;&gt; &gt; _______________________________________________<br>
&gt;&gt; &gt; NumPy-Discussion mailing list<br>
&gt;&gt; &gt; <a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
&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; I was curious about how fast ndimage was for this operation so here&#39;s<br>
&gt;&gt; the complete function.<br>
&gt;&gt;<br>
&gt;&gt; import scipy.ndimage as ndi<br>
&gt;&gt;<br>
&gt;&gt; N = 10000<br>
&gt;&gt;<br>
&gt;&gt; lat = np.random.randint(0, 360, N)<br>
&gt;&gt; lon = np.random.randint(0, 360, N)<br>
&gt;&gt; data = np.random.randn(N)<br>
&gt;&gt;<br>
&gt;&gt; def group_mean(lat, lon, data):<br>
&gt;&gt;    indexer = np.lexsort((lon, lat))<br>
&gt;&gt;    lat = lat.take(indexer)<br>
&gt;&gt;    lon = lon.take(indexer)<br>
&gt;&gt;    sorted_data = data.take(indexer)<br>
&gt;&gt;<br>
&gt;&gt;    keys = 1000 * lat + lon<br>
&gt;&gt;    unique_keys = np.unique(keys)<br>
&gt;&gt;<br>
&gt;&gt;    result = ndi.mean(sorted_data, labels=keys, index=unique_keys)<br>
&gt;&gt;    decoder = keys.searchsorted(unique_keys)<br>
&gt;&gt;<br>
&gt;&gt;    return dict(zip(zip(lat.take(decoder), lon.take(decoder)), result))<br>
&gt;&gt;<br>
&gt;&gt; Appears to be about 13x faster (and could be made faster still) than<br>
&gt;&gt; the naive version on my machine:<br>
&gt;&gt;<br>
&gt;&gt; def group_mean_naive(lat, lon, data):<br>
&gt;&gt;    grouped = collections.defaultdict(list)<br>
&gt;&gt;    for lt, ln, da in zip(lat, lon, data):<br>
&gt;&gt;      grouped[(lt, ln)].append(da)<br>
&gt;&gt;<br>
&gt;&gt;    averaged = dict((ltln, np.mean(da)) for ltln, da in grouped.items())<br>
&gt;&gt;<br>
&gt;&gt;    return averaged<br>
&gt;&gt;<br>
&gt;&gt; I had to get the latest scipy trunk to not get an error from ndimage.mean<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>
&gt; _______________________________________________<br>
&gt; NumPy-Discussion mailing list<br>
&gt; <a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
&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>
<br>
</div></div>That&#39;s the error I was getting. Depending on your OS upgrading to the<br>
scipy trunk should be the easiest fix.<br>
<div><div></div><div class="h5">_______________________________________________<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>