How can I use a mod in an array using numpy

3202 views
4

Let's say I have an array

a = ([6,8,10,13,15,18,21])

I have another array

b= ([2,5])

I want to return an array which gives me nonzero values of a%b. If any value in a mod any value in b equals zero, I don't want to return it.

c = ([13,21])

Using numpy.mod(a,b) returns

ValueError: operands could not be broadcast together with shapes

How can I execute this?

a[np.mod.outer(a, b).all(1)]?

7

The problem refers to the fact that numpy cannot apply the np.mod operation on the arrays with the given shape, one solution is to reshape, for example:

import numpy as np

a = np.array([6, 8, 10, 13, 15, 18, 21]).reshape((-1, 1))
b = np.array([2, 5])

print(a[np.mod(a, b).all(1)].reshape(-1))

Output

[13 21]

Note that you need to reshape back to obtain the requested output. The best solution is the one proposed by @PaulPanzer:

import numpy as np

a = np.array([6, 8, 10, 13, 15, 18, 21])
b = np.array([2, 5])

print(a[np.mod.outer(a, b).all(1)])

Output

[13 21]

Further

1. On numpy broadcasting see 1 and 2.
2. On outer.

posted this