Reputation: 305
I have a block of code which uses numpy.sum:
import numpy as np
n = 1000
ndice = 10
nsix = 3
dice = np.random.random_integers(6,size=(ndice,n))
p = np.sum(np.sum(dice==6,0)>=nsix)/float(n)
print 'probability:', p
I'm basically wondering, what this line is doing:
p = np.sum(np.sum(dice==6,0)>=nsix)/float(n)
Looking up the numpy.sum documentation I can't really see how it's being used: http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html
I guess there's two parts.
1 What does this accomplish?
np.sum(dice==6,0)
2 Does it.. sum a boolean?
Any explanation would be greatly appreciated, thanks.
Upvotes: 1
Views: 9558
Reputation: 101
if np.sum receives an array of booleans as its argument, it'll sum each element (count True as 1 and False as 0) and return the outcome.
for instance np.sum([True, True, False]) will output 2 :)
Hope this helps. (The other answers are correct, but maybe too correct?! (especially since you came up with that question while reading some piece of code online, so I supposed you were looking for a quick intuition)).
Upvotes: 1
Reputation: 238199
If you cant run the program yourself, I run it for you, and these are the parts of intersts:
In [28]: dice
Out[28]:
array([[2, 2, 2, ..., 5, 1, 1],
[3, 1, 3, ..., 6, 3, 5],
[1, 3, 4, ..., 6, 4, 6],
...,
[1, 4, 6, ..., 1, 1, 4],
[1, 1, 1, ..., 6, 1, 3],
[6, 2, 6, ..., 2, 6, 5]])
In [29]: dice==6
Out[29]:
array([[False, False, False, ..., False, False, False],
[False, False, False, ..., True, False, False],
[False, False, False, ..., True, False, True],
...,
[False, False, True, ..., False, False, False],
[False, False, False, ..., True, False, False],
[ True, False, True, ..., False, True, False]], dtype=bool)
In [30]: np.sum(dice==6,0)
Out[30]:
array([2, 1, 3, 3, 0, 1, 1, 2, 1, 2, 2, 2, 1, 0, 0, 3, 0, 1, 1, 4, 3, 1, 4,
2, 2, 1, 2, 1, 3, 3, 1, 3, 2, 3, 0, 1, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1,
1, 0, 4, 1, 1, 3, 1, 4, 1, 2, 0, 2, 1, 0, 1, 2, 0, 1, 1, 1, 2, 3, 3,
1, 1, 3, 1, 1, 1, 1, 0, 3, 1, 1, 2, 2, 2, 1, 3, 1, 2, 1, 1, 3, 2, 2,
2, 2, 1, 0, 0, 2, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 3, 0, 2, 3, 0, 0, 0,
3, 0, 2, 0, 0, 1, 1, 2, 1, 2, 3, 1, 1, 3, 4, 1, 1, 1, 1, 1, 2, 3, 1,
5, 2, 1, 3, 2, 2, 0, 2, 5, 1, 1, 0, 3, 3, 0, 2, 2, 2, 2, 0, 1, 2, 4,
2, 4, 0, 1, 0, 2, 2, 1, 4, 1, 2, 2, 0, 0, 2, 0, 2, 2, 1, 2, 2, 2, 1,
1, 2, 2, 2, 1, 1, 0, 1, 0, 0, 2, 2, 2, 1, 2, 2, 3, 1, 1, 0, 2, 1, 2,
1, 1, 3, 0, 2, 2, 2, 0, 2, 2, 2, 1, 2, 3, 0, 1, 3, 0, 0, 1, 0, 2, 2,
3, 2, 1, 0, 1, 1, 0, 1, 1, 1, 3, 3, 1, 2, 3, 1, 2, 0, 3, 0, 2, 2, 3,
2, 3, 1, 1, 2, 1, 2, 2, 2, 3, 1, 3, 5, 0, 1, 3, 0, 1, 4, 4, 2, 2, 0,
3, 0, 2, 1, 1, 2, 2, 4, 2, 2, 3, 0, 3, 0, 0, 1, 2, 1, 1, 0, 6, 2, 3,
0, 4, 2, 2, 4, 1, 1, 4, 2, 1, 2, 3, 2, 1, 0, 1, 1, 0, 0, 3, 0, 2, 2,
2, 1, 0, 1, 2, 0, 0, 3, 2, 2, 1, 1, 1, 1, 1, 2, 0, 1, 2, 1, 3, 1, 4,
3, 4, 2, 3, 0, 3, 2, 0, 2, 0, 4, 1, 2, 2, 2, 3, 3, 1, 0, 1, 0, 2, 2,
0, 1, 2, 2, 1, 1, 0, 3, 4, 2, 2, 5, 1, 0, 3, 4, 2, 2, 0, 2, 2, 3, 2,
1, 2, 1, 1, 4, 2, 1, 2, 1, 3, 2, 4, 2, 0, 1, 1, 3, 1, 1, 3, 2, 5, 3,
1, 3, 1, 1, 0, 3, 1, 1, 1, 0, 0, 1, 1, 2, 4, 3, 1, 2, 1, 2, 2, 1, 1,
0, 3, 1, 4, 2, 2, 2, 3, 0, 0, 4, 1, 3, 1, 2, 1, 0, 3, 2, 0, 1, 2, 1,
3, 1, 1, 1, 3, 5, 2, 0, 2, 4, 0, 2, 1, 4, 1, 4, 2, 3, 4, 3, 0, 2, 1,
2, 3, 2, 1, 1, 0, 1, 0, 1, 3, 2, 4, 2, 1, 1, 3, 4, 3, 0, 1, 2, 2, 0,
0, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 3, 4, 4, 2, 0, 2, 2, 1, 3, 0, 4, 1,
0, 1, 2, 1, 1, 1, 1, 0, 1, 2, 2, 3, 1, 2, 2, 0, 2, 1, 2, 3, 1, 2, 0,
0, 0, 4, 2, 0, 1, 0, 3, 0, 1, 5, 1, 1, 0, 2, 4, 2, 2, 0, 1, 2, 1, 1,
2, 3, 2, 3, 2, 2, 0, 0, 1, 3, 2, 2, 1, 1, 1, 0, 0, 2, 3, 2, 3, 2, 1,
2, 2, 3, 0, 2, 3, 0, 3, 2, 3, 1, 4, 0, 1, 1, 1, 3, 1, 2, 1, 2, 2, 2,
0, 1, 1, 1, 2, 2, 0, 2, 1, 2, 1, 4, 1, 1, 0, 0, 0, 0, 2, 0, 1, 1, 0,
6, 3, 3, 1, 0, 1, 2, 3, 3, 0, 2, 1, 0, 1, 1, 1, 1, 0, 2, 2, 3, 3, 2,
1, 1, 2, 1, 0, 2, 1, 4, 0, 3, 1, 1, 2, 1, 2, 1, 1, 2, 2, 2, 0, 4, 1,
3, 1, 0, 3, 0, 0, 1, 1, 2, 1, 3, 2, 1, 1, 1, 1, 1, 0, 1, 2, 1, 2, 3,
1, 2, 2, 2, 3, 3, 2, 3, 0, 0, 1, 1, 2, 4, 2, 2, 2, 1, 3, 1, 4, 1, 1,
1, 0, 1, 1, 2, 5, 2, 1, 2, 2, 2, 2, 2, 4, 2, 2, 3, 0, 2, 1, 3, 2, 1,
2, 2, 1, 0, 2, 0, 1, 3, 2, 3, 2, 1, 1, 2, 1, 1, 0, 0, 3, 1, 2, 3, 3,
2, 2, 4, 2, 2, 2, 2, 1, 2, 3, 3, 4, 0, 0, 1, 3, 1, 4, 2, 0, 4, 2, 4,
2, 1, 1, 3, 1, 0, 0, 3, 2, 1, 1, 1, 4, 3, 1, 2, 1, 1, 0, 1, 2, 3, 3,
3, 1, 2, 5, 1, 0, 1, 3, 2, 6, 0, 1, 1, 2, 2, 5, 2, 1, 3, 0, 0, 2, 3,
2, 1, 1, 0, 2, 2, 2, 2, 1, 2, 0, 0, 3, 2, 0, 2, 4, 2, 3, 2, 1, 1, 1,
2, 3, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 2, 0, 2, 3, 5, 2, 4,
1, 1, 2, 2, 3, 2, 3, 4, 1, 0, 0, 1, 1, 1, 0, 4, 1, 1, 4, 1, 0, 2, 0,
2, 2, 3, 1, 1, 2, 2, 0, 3, 3, 1, 2, 1, 1, 2, 1, 1, 3, 2, 2, 0, 3, 1,
0, 3, 2, 2, 4, 2, 6, 3, 3, 0, 3, 2, 2, 2, 2, 1, 2, 2, 0, 1, 2, 1, 1,
2, 2, 3, 2, 2, 1, 1, 2, 1, 2, 1, 1, 0, 2, 1, 2, 1, 0, 5, 0, 2, 3, 1,
2, 1, 0, 1, 1, 0, 1, 2, 4, 3, 1])
In [40]: np.sum(dice==6,0)>=nsix
Out[40]:
array([False, False, True, True, False, False, False, False, False,
False, False, False, False, False, False, True, False, False,
False, True, True, False, True, False, False, False, False,
False, True, True, False, True, False, True, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, True, False, False, True, False, True,
False, False, False, False, False, False, False, False, False,
False, False, False, False, True, True, False, False, True,
False, False, False, False, False, True, False, False, False,
False, False, False, True, False, False, False, False, True,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
True, False, False, True, False, False, False, True, False,
False, False, False, False, False, False, False, False, True,
False, False, True, True, False, False, False, False, False,
False, True, False, True, False, False, True, False, False,
False, False, True, False, False, False, True, True, False,
False, False, False, False, False, False, False, True, False,
True, False, False, False, False, False, False, True, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, True, False, False, False, False, False, False,
False, False, True, False, False, False, False, False, False,
False, False, False, False, True, False, False, True, False,
False, False, False, False, False, True, False, False, False,
False, False, False, False, False, False, True, True, False,
False, True, False, False, False, True, False, False, False,
True, False, True, False, False, False, False, False, False,
False, True, False, True, True, False, False, True, False,
False, True, True, False, False, False, True, False, False,
False, False, False, False, True, False, False, True, False,
True, False, False, False, False, False, False, False, True,
False, True, False, True, False, False, True, False, False,
True, False, False, False, True, False, False, False, False,
False, False, False, True, False, False, False, False, False,
False, False, False, False, False, True, False, False, False,
False, False, False, False, False, False, False, False, False,
True, False, True, True, True, False, True, False, True,
False, False, False, False, True, False, False, False, False,
True, True, False, False, False, False, False, False, False,
False, False, False, False, False, False, True, True, False,
False, True, False, False, True, True, False, False, False,
False, False, True, False, False, False, False, False, True,
False, False, False, False, True, False, True, False, False,
False, False, True, False, False, True, False, True, True,
False, True, False, False, False, True, False, False, False,
False, False, False, False, False, True, True, False, False,
False, False, False, False, False, False, True, False, True,
False, False, False, True, False, False, True, False, True,
False, False, False, False, True, False, False, False, False,
False, True, False, False, False, True, True, False, False,
False, True, False, False, False, True, False, True, False,
True, True, True, False, False, False, False, True, False,
False, False, False, False, False, False, True, False, True,
False, False, False, True, True, True, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, True, True, True, False, False,
False, False, False, True, False, True, False, False, False,
False, False, False, False, False, False, False, False, False,
True, False, False, False, False, False, False, False, True,
False, False, False, False, False, True, False, False, False,
False, True, False, False, True, False, False, False, False,
True, False, False, False, False, False, False, False, False,
True, False, True, False, False, False, False, False, True,
False, False, False, False, False, False, False, False, True,
False, True, False, False, False, False, True, False, False,
True, False, True, False, True, False, True, False, False,
False, False, True, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, True, False, False, False, False, False, False,
False, False, False, False, False, True, True, True, False,
False, False, False, True, True, False, False, False, False,
False, False, False, False, False, False, False, True, True,
False, False, False, False, False, False, False, False, True,
False, True, False, False, False, False, False, False, False,
False, False, False, False, True, False, True, False, False,
True, False, False, False, False, False, False, True, False,
False, False, False, False, False, False, False, False, False,
False, True, False, False, False, False, True, True, False,
True, False, False, False, False, False, True, False, False,
False, False, True, False, True, False, False, False, False,
False, False, False, True, False, False, False, False, False,
False, False, True, False, False, True, False, False, False,
True, False, False, False, False, False, False, False, False,
False, True, False, True, False, False, False, False, False,
False, False, False, True, False, False, True, True, False,
False, True, False, False, False, False, False, False, True,
True, True, False, False, False, True, False, True, False,
False, True, False, True, False, False, False, True, False,
False, False, True, False, False, False, False, True, True,
False, False, False, False, False, False, False, True, True,
True, False, False, True, False, False, False, True, False,
True, False, False, False, False, False, True, False, False,
True, False, False, False, True, False, False, False, False,
False, False, False, False, False, False, False, False, True,
False, False, False, True, False, True, False, False, False,
False, False, True, False, True, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, True, True, False, True, False, False, False,
False, True, False, True, True, False, False, False, False,
False, False, False, True, False, False, True, False, False,
False, False, False, False, True, False, False, False, False,
False, True, True, False, False, False, False, False, False,
False, True, False, False, False, True, False, False, True,
False, False, True, False, True, True, True, False, True,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, True, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, True, False, False, True, False, False,
False, False, False, False, False, False, False, True, True, False], dtype=bool)
In [32]: np.sum(np.sum(dice==6,0)>=nsix)
Out[32]: 212
Hope this clarifies things. So to answer to your question "Does it.. sum a boolean?" - yes it does.
Simple example for sum:
In [45]: a = np.array([2,5,6,1])
In [46]: a>3
Out[46]: array([False, True, True, False], dtype=bool)
In [47]: np.sum(a>3)
Out[47]: 2
Upvotes: 1
Reputation: 381
dice
is a ndice x n
or 10 x 1000 matrix of integer values from 1 to 6. dice==6
turns that matrix into a matrix of booleans corresponding to True for all the 6s.
np.sum(dice==6,0)
is the same as np.sum(dice==6, axis=0)
, meaning the sum is taken along the ndice
axis, so now you have a 1 x 1000 array. You have n=1000 runs, each run has ndice=10 die. This 1 x 1000 array now represents how many die out of 10 in each run turned up 6s.
np.sum(dice==6,0)>=nsix
converts that to a boolean 1 x 1000 array, which for each run (here we have 1000 runs) will be true if at least nsix
number of die turn up 6s. Taking the sum of this 1 x 1000 array then gives you the number of runs where this is true.
Upvotes: 2