- Given the following array, where the elements in the array are a value at index
[0], and its frequency at index[1].
import numpy as np a = np.array([[767, 5], [770, 5], [772, 7], [779, 7], [781, 5], [782, 7], [787, 5]]) # values v = a[:, 0] array([767, 770, 772, 779, 781, 782, 787]) # frequencies f = a[:, 1] array([5, 5, 7, 7, 5, 7, 5])
- I need an array that is the length of the sum of the
frequencies, filled withv, based on their respective frequency.
[767, 767, 767, 767, 767, 770, 770, 770, 770, 770, 772, 772, 772, 772, 772, 772, 772, 779, 779, 779, 779, 779, 779, 779, 781, 781, 781, 781, 781, 782, 782, 782, 782, 782, 782, 782, 787, 787, 787, 787, 787]
- This can be done with
# a for-loop
ix = list()
for (x, y) in a:
l = [x] * y
ix.extend(l)
# a list-comprehension
ix = [v for (x, y) in a for v in [x]*y]
How can I do this with a vectorized
numpymethod?- No
for-loops - No
pandas
- No
I thought of creating an array of zeros, whose length is the sum of frequencies, but I’m not certain how to fill it.
za = np.zeros(sum(f))
Advertisement
Answer
Use numpy.repeat:
np.repeat(a[:, 0], a[:, 1]) # np.repeat(*a.T) # In case its (n, 2) shaped
Output:
array([767, 767, 767, 767, 767, 770, 770, 770, 770, 770, 772, 772, 772,
772, 772, 772, 772, 779, 779, 779, 779, 779, 779, 779, 781, 781,
781, 781, 781, 782, 782, 782, 782, 782, 782, 782, 787, 787, 787,
787, 787])