I have a list of arrays and I would like to get the cartesian product of the elements in the arrays.
I will use an example to make this more concrete...
itertools.product seems to do the trick but I am stuck in a little detail.
arrays = [(-1,+1), (-2,+2), (-3,+3)];
If I do
cp = list(itertools.product(arrays));
I get
cp = cp0 = [((-1, 1),), ((-2, 2),), ((-3, 3),)]
But what I want to get is
cp1 = [(-1,-2,-3), (-1,-2,+3), (-1,+2,-3), (-1,+2,+3), ..., (+1,+2,-3), (+1,+2,+3)].
I have tried a few different things:
cp = list(itertools.product(itertools.islice(arrays, len(arrays)))); cp = list(itertools.product(iter(arrays, len(arrays))));
They all gave me cp0 instead of cp1.
Any ideas?
Thanks in advance.
That being said, the iterators from itertools are often significantly faster than regular iteration from a standard Python for loop.
Get Cartesian Product in Python Using the itertools ModuleThe product(*iterables, repeat=1) method of the itertools module takes iterables as input and returns their cartesian product as output. The cartesian product order will be the order of each set/list in the provided argument iterables .
>>> list(itertools.product(*arrays)) [(-1, -2, -3), (-1, -2, 3), (-1, 2, -3), (-1, 2, 3), (1, -2, -3), (1, -2, 3), (1, 2, -3), (1, 2, 3)]
This will feed all the pairs as separate arguments to product
, which will then give you the cartesian product of them.
The reason your version isn't working is that you are giving product
only one argument. Asking for a cartesian product of one list is a trivial case, and returns a list containing only one element (the list given as argument).
>>> arrays = [(-1,+1), (-2,+2), (-3,+3)] >>> list(itertools.product(*arrays)) [(-1, -2, -3), (-1, -2, 3), (-1, 2, -3), (-1, 2, 3), (1, -2, -3), (1, -2, 3), (1, 2, -3), (1, 2, 3)]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With