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"