我有一个包含两列的文本文件。我们称他们为r and xi
,然后使用r,xi = numpy.loadtext
r xi
2.5 2.510891
7.5 -0.436541
12.5 0.576983
17.5 0.377067
22.5 0.19648
27.5 -0.003876
32.5 0.117554
37.5 0.136895
42.5 0.261832
47.5 -0.08984
我知道如何删除xi
中的所有负值。我使用xi = [i for i in xi if i>0]
给了我所有的正值。
我现在如何删除相应的r
值?
在上面的示例中,第二行r和xi应该作为xi = -0.4
删除,依此类推。
答案 0 :(得分:5)
你可以使用与你现在拥有的非常相似的列表理解:
comp_list = [(r_i, xi_i) for r_i, xi_i in zip(r, xi) if xi_i > 0]
这将为您提供一个元组列表,然后您可以轻松地将其分开
<强>演示:强>
>>> r = [2.5, 7.5, 12.5, 17.5, 22.5, 27.5]
>>> xi = [2.51, -0.43, 0.57, 0.37, 0.19, -0.003]
>>> comp_list = [(r_i, xi_i) for r_i, xi_i in zip(r, xi) if xi_i > 0]
>>> comp_list
[(2.5, 2.51), (12.5, 0.57), (17.5, 0.37), (22.5, 0.19)]
>>> r, xi = zip(*comp_list)
>>> r
(2.5, 12.5, 17.5, 22.5)
>>> xi
(2.51, 0.57, 0.37, 0.19)
或者如果你是那些喜欢一次性完成这一切的人之一:
r, xi = zip(*[(r_i, xi_i) for r_i, xi_i in zip(r, xi) if xi_i > 0])
答案 1 :(得分:5)
[注意:甚至认为这个问题引用了python&#34;列出&#34;,因为用于读取对象的命令是numpy.loadtxt
,我们实际上有numpy数组对象,所以让我们来看看&#39;利用这一点。]
您可以创建一个布尔数组并使用它来索引,而不是使用列表推导。您应该阅读"advanced indexing"上的教程部分。例如:
>>> r, xi = np.loadtxt("s.dat", skiprows=1, unpack=True)
>>> keep = xi > 0
>>> keep
array([ True, False, True, True, True, False, True, True, True, False], dtype=bool)
此数组在xi > 0
处为True,而在keep
处为False。我们现在可以使用>>> r[keep]
array([ 2.5, 12.5, 17.5, 22.5, 32.5, 37.5, 42.5])
>>> xi[keep]
array([ 2.510891, 0.576983, 0.377067, 0.19648 , 0.117554, 0.136895,
0.261832])
来选择我们想要的内容:
{{1}}
答案 2 :(得分:0)
为什么你不想在将它们分成两个列表之前过滤行?
source_lines = numpy.loadtext(f)
filtered_lines = [x for x in source_lines if x[1] > 0]