Skip to content Skip to sidebar Skip to footer

How To Extract Specific Numbers Based On The Conditions In Python

I have a bunch of lines created by connecting some points. I have the number number of lines as a numpy array: line_no_A= np.arange (17, 31) sep_A=23 These lines are arranged in t

Solution 1:

This is the first part:

# SCENARIO A

import numpy as np
from scipy.ndimage.interpolation import shift

# Input data
line_no_A = np.arange(17, 31)
sep_A = 23
point_rep_A = np.array([4, 3, 3, 1])

# RED LINES# Red candidates
point_rep_red = point_rep_A - 1
red_A = line_no_A[np.where(line_no_A == sep_A)[0][0]+1:]

# Build red array
red_array = np.zeros(shape=(3, 4))
red_lines_index = np.cumsum(point_rep_red)
red_lines_index = np.insert(red_lines_index, 0, 0)
for i in range(len(red_lines_index)-1):
    red_array[:,i][:point_rep_red[i]] = red_A[red_lines_index[i]:red_lines_index[i + 1]][::-1]

# Select red lines
shift_rep_A = point_rep_red - shift(point_rep_red, -1, cval=0)
red_specific = [red_array[:, i][:point_rep_red[i]][red_array[:, i][:point_rep_red[i]].size-ind:][::-1] for i, ind in enumerate(shift_rep_A)]
red_specific = np.array(red_specific, dtype=object)

# BLUE LINES# Blue candidates
blue_A = line_no_A[:np.where(line_no_A == sep_A)[0][0]+1]

# Build blue array
blue_array = np.zeros(shape=(3, 3))
blue_lines_index = np.cumsum(point_rep_A[1:])
blue_lines_index = np.insert(blue_lines_index, 0, 0)
for i in range(len(blue_lines_index)-1):
    blue_array[:,i][:point_rep_A[i+1]] = blue_A[blue_lines_index[i]:blue_lines_index[i + 1]][::-1]

# Select blue lines
first_change_index = np.argmax(shift_rep_A > 0)  # index of first change in point_rep_A
blue_specific = np.array([blue_array[point_rep_A[i+1]-1, i] for i in range(blue_array.shape[1])])
blue_specific[:first_change_index] = np.nan  # skip values before the first change in point_rep_A
blue_specific = np.append(blue_specific, np.nan)  # make it the same length as red_specific
blue_specific = np.array(blue_specific, dtype=object)

# Merge red lines and blue lines
result_A = np.hstack(np.ravel(np.column_stack((red_specific, blue_specific))))
result_A = result_A[~np.isnan(result_A)]  # remove NaNs
print(result_A)

And the output is:

[24. 17. 20. 29. 30. 23.]

Post a Comment for "How To Extract Specific Numbers Based On The Conditions In Python"