如何 select 根据其他列表的条件列出元素
How to select list elements based on crteria from other lists
我是 Python 的新手,来自 SciLab(开源 MatLab ersatz),我将其用作分析(测试数据分析、可靠性、声学等)的工具箱;我绝对不是计算机科学小伙子。
我有相同长度列表形式的数据(SciLab 中相同大小的向量)。
我使用其中一些作为参数,以便 select 来自另一个的数据;例如
t_v = [1:10]; // a parameter vector
p_v = [20:29]; another parameter vector
res_v(t_v > 5 & p_v < 28); // are the res_v vector elements of which "corresponding" p_v and t_v values comply with my criteria; i can use it for analyses.
这在SciLab中非常直接和简单;我没有找到用 Python 实现相同效果的方法,无论是“Pythonically”还是简单翻译。
有什么可以帮助我的想法吗?
祝你今天过得愉快,
帕特里克
这是我根据您最后的评论修改的解决方案。
t_v = list(range(1,10))
p_v = list(range(20,29))
res_v = list(range(30,39))
def first_idex_greater_than(search_number, lst):
for count, number in enumerate(lst):
if number > search_number:
return count
def first_idex_lower_than(search_number, lst):
for count, number in enumerate(lst[::-1]):
if number < search_number:
return len(lst) - count # since I searched lst from top to bottom,
# I need to also reverse count
t_v_index = first_idex_greater_than(5, t_v)
p_v_index = first_idex_lower_than(28, p_v)
print(res_v[min(t_v_index, p_v_index):max(t_v_index, p_v_index)])
它returns 一个数组[35, 36, 37]
。
我相信你可以根据你的需要更好地优化它。
问题陈述没有明确定义,但这是我认为可能的解决方案。
import pandas as pd
tv = list(range(1, 11))
pv = list(range(20, 30))
res = list(range(30, 40))
df = pd.DataFrame({'tv': tv, 'pv': pv, 'res': res})
print(df)
def criteria(row, col1, a, col2, b):
if (row[col1] > a) & (row[col2] < b):
return True
else:
return False
df['select'] = df.apply(lambda row: criteria(row, 'tv', 5, 'pv', 28), axis=1)
selected_res = df.loc[df['select']]['res'].tolist()
print(selected_res)
# ... or another way ..
print(df.loc[(df.tv > 5) & (df.pv < 28)]['res'])
这会生成一个数据框,其中每一列都是原始列表,并根据列 tv 和 pv 应用选择标准来识别满足(或不满足)依赖于 2 个列表的标准的行),然后创建一个新的布尔值列,标识条件为 True 或 False 的行。
[35, 36, 37]
5 35
6 36
7 37
您可以使用 numpy 数组。很简单:
import numpy as np
par1 = np.array([1,1,5,5,5,1,1])
par2 = np.array([-1,1,1,-1,1,1,1])
data = np.array([1,2,3,4,5,6,7])
print(par1)
print(par2)
print(data)
bool_filter = (par1[:]>1) & (par2[:]<0)
# example to do it directly in the array
filtered_data = data[ par1[:]>1 ]
print( filtered_data )
#filtering with the two parameters
filtered_data_twice = data[ bool_filter==True ]
print( filtered_data_twice )
输出:
[1 1 5 5 5 1 1]
[-1 1 1 -1 1 1 1]
[1 2 3 4 5 6 7]
[3 4 5]
[4]
请注意,它不会保持相同数量的元素。
我是 Python 的新手,来自 SciLab(开源 MatLab ersatz),我将其用作分析(测试数据分析、可靠性、声学等)的工具箱;我绝对不是计算机科学小伙子。 我有相同长度列表形式的数据(SciLab 中相同大小的向量)。 我使用其中一些作为参数,以便 select 来自另一个的数据;例如
t_v = [1:10]; // a parameter vector
p_v = [20:29]; another parameter vector
res_v(t_v > 5 & p_v < 28); // are the res_v vector elements of which "corresponding" p_v and t_v values comply with my criteria; i can use it for analyses.
这在SciLab中非常直接和简单;我没有找到用 Python 实现相同效果的方法,无论是“Pythonically”还是简单翻译。 有什么可以帮助我的想法吗? 祝你今天过得愉快, 帕特里克
这是我根据您最后的评论修改的解决方案。
t_v = list(range(1,10))
p_v = list(range(20,29))
res_v = list(range(30,39))
def first_idex_greater_than(search_number, lst):
for count, number in enumerate(lst):
if number > search_number:
return count
def first_idex_lower_than(search_number, lst):
for count, number in enumerate(lst[::-1]):
if number < search_number:
return len(lst) - count # since I searched lst from top to bottom,
# I need to also reverse count
t_v_index = first_idex_greater_than(5, t_v)
p_v_index = first_idex_lower_than(28, p_v)
print(res_v[min(t_v_index, p_v_index):max(t_v_index, p_v_index)])
它returns 一个数组[35, 36, 37]
。
我相信你可以根据你的需要更好地优化它。
问题陈述没有明确定义,但这是我认为可能的解决方案。
import pandas as pd
tv = list(range(1, 11))
pv = list(range(20, 30))
res = list(range(30, 40))
df = pd.DataFrame({'tv': tv, 'pv': pv, 'res': res})
print(df)
def criteria(row, col1, a, col2, b):
if (row[col1] > a) & (row[col2] < b):
return True
else:
return False
df['select'] = df.apply(lambda row: criteria(row, 'tv', 5, 'pv', 28), axis=1)
selected_res = df.loc[df['select']]['res'].tolist()
print(selected_res)
# ... or another way ..
print(df.loc[(df.tv > 5) & (df.pv < 28)]['res'])
这会生成一个数据框,其中每一列都是原始列表,并根据列 tv 和 pv 应用选择标准来识别满足(或不满足)依赖于 2 个列表的标准的行),然后创建一个新的布尔值列,标识条件为 True 或 False 的行。
[35, 36, 37]
5 35
6 36
7 37
您可以使用 numpy 数组。很简单:
import numpy as np
par1 = np.array([1,1,5,5,5,1,1])
par2 = np.array([-1,1,1,-1,1,1,1])
data = np.array([1,2,3,4,5,6,7])
print(par1)
print(par2)
print(data)
bool_filter = (par1[:]>1) & (par2[:]<0)
# example to do it directly in the array
filtered_data = data[ par1[:]>1 ]
print( filtered_data )
#filtering with the two parameters
filtered_data_twice = data[ bool_filter==True ]
print( filtered_data_twice )
输出:
[1 1 5 5 5 1 1]
[-1 1 1 -1 1 1 1]
[1 2 3 4 5 6 7]
[3 4 5]
[4]
请注意,它不会保持相同数量的元素。