<meta http-equiv="content-type" content="text/html; charset=utf-8"><span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px; ">Hello,<br><br>ĀI am having trouble with performance when trying to create a crossĀ</span><div>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px; ">tabulation using numpy. ĀIdeally, I would calculate each cell in the<br>cross tabulation separately because this gives me the greatest amount<br>
of flexibility. ĀI have included some sample code as a reference and<br>am really looking for better approaches to the simpleLoop method. ĀSo<br>far the histogram2d and histogramdd methods seem to outperform any<br>code I write by a factor of about 100, at least. ĀI chalk this up to I<br>
just don't understand enough about numpy, yet. ĀAny help would be<br>appreciated.<br><br>Here is the test code:<br>import numpy as np<br>import time<br>import random<br><br><br># Create a simple loop and count up the number of matching cases<br>
# Basic cross tabulation or histogram of the data<br># This approach is prefered because of the need to customize the<br>calculation potentially for each cell.<br>def simpleLoop(c):<br><br>Ā Ā Ā Ā#number of items per inner loop<br>
Ā Ā Ā Āa_cnt = len(np.unique(c[:,0]))<br>Ā Ā Ā Āb_cnt = len(np.unique(c[:,1]))<br>Ā Ā Ā Āidx = 0<br>Ā Ā Ā Āresult = np.zeros(b_cnt * a_cnt)<br>Ā Ā Ā Āfor i in np.unique(c[:,0]):<br>Ā Ā Ā Ā Ā Ā Ā Āfor j in np.unique(c[:,1]):<br>
Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Āresult[idx] = np.sum(1*(c[:,0] == i) & (c[:,1] == j))<br>Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Āidx += 1<br><br>Ā Ā Ā Āresult.resize(len(result)/b_cnt,b_cnt)<br>Ā Ā Ā Āreturn result<br><br><br># Use numpys histogram method to calculate the matrix of combinations<br>
and the number of cases in each one.<br>def simpleHistogram(c):<br><br>Ā Ā Ā Ā#number of items per inner loop<br>Ā Ā Ā Āreturn np.histogramdd((c[:,0],c[:,1]), bins=[np.unique(c[:,<br>0]),range(1,11)])<br><br><br># Variation1 of simple histogram<br>
def simpleHistogram1(c):<br><br>Ā Ā Ā Ā#number of items per inner loop<br>Ā Ā Ā Āresults = []<br>Ā Ā Ā Āfor i in np.unique(c[:,1]):<br>Ā Ā Ā Ā Ā Ā Ā Āresults.append(np.histogramdd((c[:,0][c[:,1]==i]),<br>bins=[np.unique(c[:,0])]) or 0)<br>
<br>Ā Ā Ā Āreturn np.column_stack([result for result in results])<br><br>if __name__ == '__main__':<br>Ā Ā Ā Āa = np.random.randint(1,900,200000)<br>Ā Ā Ā Āb = np.random.randint(1,10,200000)<br>Ā Ā Ā Āc = np.column_stack((a,b))<br>
<br>Ā Ā Ā Āprint '---- Simple Loop ----'<br>Ā Ā Ā Āstart = time.time()<br>Ā Ā Ā Āresults = simpleLoop(c)<br>Ā Ā Ā Āprint results<br>Ā Ā Ā Āprint time.time() - start<br><br>Ā Ā Ā Āprint '---- Histogram dd no looping ----'<br>
Ā Ā Ā Āstart = time.time()<br>Ā Ā Ā Āresults = simpleHistogram(c)<br>Ā Ā Ā Āprint results<br>Ā Ā Ā Āprint time.time() - start<br><br>Ā Ā Ā Āprint '---- Histogram run 1 time for each item in column 1 (10 times)<br>
----'<br>Ā Ā Ā Āstart = time.time()<br>Ā Ā Ā Āresults = simpleHistogram1(c)<br>Ā Ā Ā Āprint results<br>Ā Ā Ā Āprint time.time() - start</span></div>