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