如何 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]
                               

请注意,它不会保持相同数量的元素。