Skip to content
Advertisement

Return a numpy array, with numbers of elements specified in another array

Suppose I have two numpy arrays A, B, with A.shape = (2,4,3) and B.shape = (2,4):

A =
[[[-1 -1  0]
  [-1  0  0]
  [-1  0  0]
  [ 0 -1  0]]

 [[-1  0  0]
  [-1  0  0]
  [-1  1  0]
  [ 0  0  0]]]

B = 
[[0 2 0 3]
 [1 0 0 0]]

Now I would like to get a new array C with C.shape = (2+3+1,3) = (6,3), such that each integer in B specifies the number of the corresponding 3×1 array in A. In other words, A[i,j,:] should appear B[i,j] times in C. In our case,

C = 
[[-1  0  0]
 [-1  0  0]
 [ 0 -1  0]
 [ 0 -1  0]
 [ 0 -1  0]
 [-1  0  0]]

What is the fastest way to obtain C?

Advertisement

Answer

I can think of doing this by reshaping A into a simple 2D array of which the rows A[i], are to be repeated according to the count in B[i].

Note that B is also flattened to be a 1D array.

import numpy as np

A = np.array([[[-1, -1,  0],
  [-1,  0,  0],
  [-1,  0,  0],
  [ 0, -1,  0]],

 [[-1,  0,  0],
  [-1,  0,  0],
  [-1,  1,  0],
  [ 0,  0,  0]]])

B = np.array([[0, 2, 0, 3],
 [1, 0, 0, 0]])

A = A.reshape(-1, A.shape[2]) # A.shape becomes (8, 3)
B = B.reshape(-1)             # B.shape becomes (8, )

C = np.repeat(A, B, axis = 0)
>>>C

Output:

array([[-1,  0,  0],
       [-1,  0,  0],
       [ 0, -1,  0],
       [ 0, -1,  0],
       [ 0, -1,  0],
       [-1,  0,  0]])

Here is how np.repeat() works, in case you need reference.

User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement