Uma Maheshwaraa
Uma Maheshwaraa

Reputation: 603

building a specific sequence with python numpy

Hi I have two arrays as below.

1) An array made up of 1 and 0. 1 Signifies that its an active day and 0 is a holiday.

2) An arithmetic sequence which is smaller in length compared to array 1.

The result array needs to be a combination of 1) & 2) wherein the arithmetic sequence needs to follow the positions of 1s. In other words the array 2 needs to expanded to array 1 length with 0s inserted in the same position as array 1.

One way i could solve this is using numpy.insert with slice. However, since the lengths are different and the array 1 is dynamic i need an efficient way to achieve this.

Thanks

Final result

Upvotes: 0

Views: 951

Answers (3)

Allen Qin
Allen Qin

Reputation: 19947

An alternative one-liner solution

Setup

binary = np.array([1, 1, 0, 1, 0, 1, 1, 0, 1, 0])
arithmetic = np.arange(1, 7)

Solution

#find 1s from binary and set values from arithmetic
binary[np.where(binary>0)] = arithmetic

Out[400]: array([1, 2, 0, 3, 0, 4, 5, 0, 6, 0])

Upvotes: 1

Vaishali
Vaishali

Reputation: 38415

Another way would be to create a copy of binary array and replace all non-zero values by arithmatic array

seq = np.arange(1, len(bi_arr[bi_arr != 0])+1)

final_result = bi_arr.copy()

final_result[final_result != 0] = seq

print(final_result)

array([1, 2, 0, 3, 0, 4, 5, 0, 6, 0])

The bi-arr remains unchanged

Upvotes: 0

Robert Kern
Robert Kern

Reputation: 13430

Create the result array of the right length (len(binary)) filled with 0s, then use the binary array as a mask to assign into the result array. Make sure the binary mask is of the bool dtype.

>>> binary = np.array([1, 1, 0, 1, 0, 1, 1, 0, 1, 0], dtype=bool)
>>> arithmetic = np.arange(1, 7)
>>> result = np.zeros(len(binary), dtype=arithmetic.dtype)
>>> result[binary] = arithmetic
>>> result
array([1, 2, 0, 3, 0, 4, 5, 0, 6, 0])

Upvotes: 1

Related Questions