<div dir="ltr"><div>A simple fix would certainly by pass the check in random.choice, but I don't know how to get that. So let's focus on the summation.</div><div><br></div>I believe you are hitting an instability in summing small numbers as a power to 10th order would produce. Here is an example:<div><br></div><div><div>mymatrix = np.random.rand(1024,1024).astype('float16')*1e-7</div><div>row_normalized = mymatrix / np.sum(mymatrix, axis=1, keepdims=True)<br></div><div>sum<span style="font-size:12.8px">s = row_normalized.sum(axis=1)</span></div><div>len(sums[sums != 1]) # ->  108</div></div><div><br></div><div>One can use things like Kahan summation and you will need to collect the size of the error and truncate all numbers in mymatrix under that error.  I'm not quite sure how to quickly implement such a thing in numpy without a loop.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Dec 18, 2015 at 7:00 PM, Nathaniel Smith <span dir="ltr"><<a href="mailto:njs@pobox.com" target="_blank">njs@pobox.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Fri, Dec 18, 2015 at 1:25 PM, Ryan R. Rosario <<a href="mailto:ryan@bytemining.com">ryan@bytemining.com</a>> wrote:<br>
> Hi,<br>
><br>
> I have a matrix whose entries I must raise to a certain power and then normalize by row. After I do that, when I pass some rows to numpy.random.choice, I get a ValueError: probabilities do not sum to 1.<br>
><br>
> I understand that floating point is not perfect, and my matrix is so large that I cannot use np.longdouble because I will run out of RAM.<br>
><br>
> As an example on a smaller matrix:<br>
><br>
> np.power(mymatrix, 10, out=mymatrix)<br>
> row_normalized = np.apply_along_axis(lambda x: x / np.sum(x), 1, mymatrix)<br>
<br>
</span>I'm sorry I don't have a solution to your actual problem off the top<br>
of my head, but it's probably helpful in general to know that a better<br>
way to write this would be just<br>
<br>
  row_normalized = mymatrix / np.sum(mymatrix, axis=1, keepdims=True)<br>
<br>
apply_along_axis is slow and can almost always be replaced by a<br>
broadcasting expression like this.<br>
<span class=""><br>
> sums = row_normalized.sum(axis=1)<br>
> sums[np.where(sums != 1)]<br>
<br>
</span>And here you can just write<br>
<br>
  sums[sums != 1]<br>
<br>
i.e. the call to where() isn't doing anything useful.<br>
<span class="HOEnZb"><font color="#888888"><br>
-n<br>
<br>
--<br>
Nathaniel J. Smith -- <a href="http://vorpus.org" rel="noreferrer" target="_blank">http://vorpus.org</a><br>
</font></span><div class="HOEnZb"><div class="h5">_______________________________________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
<a href="https://mail.scipy.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.scipy.org/mailman/listinfo/numpy-discussion</a><br>
</div></div></blockquote></div><br></div>