Using numpy to build an array of all combinations of two arrays

后端 未结 10 1308
温柔的废话
温柔的废话 2020-11-22 00:41

I\'m trying to run over the parameters space of a 6 parameter function to study it\'s numerical behavior before trying to do anything complex with it so I\'m searching for a

相关标签:
10条回答
  • 2020-11-22 01:33

    you can use np.array(itertools.product(a, b))

    0 讨论(0)
  • 2020-11-22 01:36

    itertools.combinations is in general the fastest way to get combinations from a Python container (if you do in fact want combinations, i.e., arrangements WITHOUT repetitions and independent of order; that's not what your code appears to be doing, but I can't tell whether that's because your code is buggy or because you're using the wrong terminology).

    If you want something different than combinations perhaps other iterators in itertools, product or permutations, might serve you better. For example, it looks like your code is roughly the same as:

    for val in itertools.product(np.arange(0, 1, 0.1), repeat=6):
        print F(val)
    

    All of these iterators yield tuples, not lists or numpy arrays, so if your F is picky about getting specifically a numpy array you'll have to accept the extra overhead of constructing or clearing and re-filling one at each step.

    0 讨论(0)
  • 2020-11-22 01:38

    For a pure numpy implementation of Cartesian product of 1D arrays (or flat python lists), just use meshgrid(), roll the axes with transpose(), and reshape to the desired ouput:

     def cartprod(*arrays):
         N = len(arrays)
         return transpose(meshgrid(*arrays, indexing='ij'), 
                          roll(arange(N + 1), -1)).reshape(-1, N)
    

    Note this has the convention of last axis changing fastest ("C style" or "row-major").

    In [88]: cartprod([1,2,3], [4,8], [100, 200, 300, 400], [-5, -4])
    Out[88]: 
    array([[  1,   4, 100,  -5],
           [  1,   4, 100,  -4],
           [  1,   4, 200,  -5],
           [  1,   4, 200,  -4],
           [  1,   4, 300,  -5],
           [  1,   4, 300,  -4],
           [  1,   4, 400,  -5],
           [  1,   4, 400,  -4],
           [  1,   8, 100,  -5],
           [  1,   8, 100,  -4],
           [  1,   8, 200,  -5],
           [  1,   8, 200,  -4],
           [  1,   8, 300,  -5],
           [  1,   8, 300,  -4],
           [  1,   8, 400,  -5],
           [  1,   8, 400,  -4],
           [  2,   4, 100,  -5],
           [  2,   4, 100,  -4],
           [  2,   4, 200,  -5],
           [  2,   4, 200,  -4],
           [  2,   4, 300,  -5],
           [  2,   4, 300,  -4],
           [  2,   4, 400,  -5],
           [  2,   4, 400,  -4],
           [  2,   8, 100,  -5],
           [  2,   8, 100,  -4],
           [  2,   8, 200,  -5],
           [  2,   8, 200,  -4],
           [  2,   8, 300,  -5],
           [  2,   8, 300,  -4],
           [  2,   8, 400,  -5],
           [  2,   8, 400,  -4],
           [  3,   4, 100,  -5],
           [  3,   4, 100,  -4],
           [  3,   4, 200,  -5],
           [  3,   4, 200,  -4],
           [  3,   4, 300,  -5],
           [  3,   4, 300,  -4],
           [  3,   4, 400,  -5],
           [  3,   4, 400,  -4],
           [  3,   8, 100,  -5],
           [  3,   8, 100,  -4],
           [  3,   8, 200,  -5],
           [  3,   8, 200,  -4],
           [  3,   8, 300,  -5],
           [  3,   8, 300,  -4],
           [  3,   8, 400,  -5],
           [  3,   8, 400,  -4]])
    

    If you want to change the first axis fastest ("FORTRAN style" or "column-major"), just change the order parameter of reshape() like this: reshape((-1, N), order='F')

    0 讨论(0)
  • 2020-11-22 01:39

    You can do something like this

    import numpy as np
    
    def cartesian_coord(*arrays):
        grid = np.meshgrid(*arrays)        
        coord_list = [entry.ravel() for entry in grid]
        points = np.vstack(coord_list).T
        return points
    
    a = np.arange(4)  # fake data
    print(cartesian_coord(*6*[a])
    

    which gives

    array([[0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 0, 2],
       ..., 
       [3, 3, 3, 3, 3, 1],
       [3, 3, 3, 3, 3, 2],
       [3, 3, 3, 3, 3, 3]])
    
    0 讨论(0)
提交回复
热议问题