user2875994
user2875994

Reputation: 305

Boolean in a numpy sum

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

Answers (3)

Sina Meraji
Sina Meraji

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

Marcin
Marcin

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

transcranial
transcranial

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

Related Questions