user7503022
user7503022

Reputation:

Creating an array of 3D vectors where each element of each vector is from a given range

I am trying to implement an array of 3D vectors. All vectors are combination of element ranges. What I mean is:

array = [v_1, v_2, v_3,....]

v_j = [x_1, x_2, x_3] with x_i in [a, b]. 

The important thing for me is, that I want to have all possible combinations.

So for example let a = 1, b = 10. Then it should be something like:

v_1 = [1, 1, 1], v_2 = [1, 1, 2],...v_10 = [1, 1, 10]

and then the next one should be:

v_11 = [1, 2, 1], v_12 = [1, 2, 2].... 

I tried it by using linspace but I just get the vectors where each element is equal i.e.

v_1 = [1, 1, 1], v_2 = [2, 2, 2]....

Is there an easy way to do this or do I have to do it by a lot of loops.

My linspace example was:

ffac = np.linspace(-1E-3, 1E-3, 100, endpoint=True)

for i in range(100):
            eps = np.ones(shape=[100, ]) * ffac[i]

Upvotes: 1

Views: 96

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477230

With a and b, we can make np.arange(a, b+1), and then use np.meshgrid:

xij = np.arange(a, b+1)
np.transpose(np.meshgrid(xij, xij, xij), (2,1,3,0))

For b=2, we obtain:

>>> np.transpose(np.meshgrid(xij, xij, xij), (2,1,3,0))
array([[[[1, 1, 1],
         [1, 1, 2]],

        [[1, 2, 1],
         [1, 2, 2]]],

       [[[2, 1, 1],
         [2, 1, 2]],

        [[2, 2, 1],
         [2, 2, 2]]]])

For a vector of n options, the result is thus a n×n×n×3.

Or if you want to flatten it:

>>> np.transpose(np.meshgrid(xij, xij, xij), (2,1,3,0)).reshape(-1, 3)
array([[1, 1, 1],
       [1, 1, 2],
       [1, 2, 1],
       [1, 2, 2],
       [2, 1, 1],
       [2, 1, 2],
       [2, 2, 1],
       [2, 2, 2]])

Upvotes: 1

Related Questions