Python 以并行方式从数组中删除条目
我有一个x和y坐标的列表/数组,例如:Python 以并行方式从数组中删除条目,python,arrays,list,numpy,Python,Arrays,List,Numpy,我有一个x和y坐标的列表/数组,例如: x = [x1, x2, x3,...] y = [y1, y2, y3,...] 现在,我想根据以下条件删除某些条目: for i in x: if i <= 40 and i >= -40: print "True" else: x.remove(i) for i in y: if i <= 20 and i >=- 20: print "True"
x = [x1, x2, x3,...]
y = [y1, y2, y3,...]
现在,我想根据以下条件删除某些条目:
for i in x:
if i <= 40 and i >= -40:
print "True"
else:
x.remove(i)
for i in y:
if i <= 20 and i >=- 20:
print "True"
else:
y.remove(i)
要获得类似于([[x1,y1],[x2,y2],[x3,y3],…])的数组,请执行以下操作。
,但我不确定如何使用if条件从中删除条目
谢谢。这个就可以了
for i in x1:
if i <= 40 and i >= -40:
print "True"
for i in y1:
if i <=20 and i >=-20:
print "True"
else:
x1.remove(i)
y1.remove(i)
else:
x1.remove(i)
y1.remove(i)
x1中i的:
如果i=-40:
打印“真”
对于y1中的i:
如果i=-20:
打印“真”
其他:
x1.移除(i)
y1.移除(i)
其他:
x1.移除(i)
y1.移除(i)
希望这有帮助
谢谢 另一个选项是使用
列表理解
:
输入:
代码:
试试这个:
mask = ((x <= 40) & (x >= -40) & (y <= 20) & (y >= -20))
x, y = x[mask], y[mask]
mask=((x=-40)和(y=-20))
x、 y=x[遮罩],y[遮罩]
NumPy将矢量化这些操作,因此它应该非常高效
博客文章可能会有所帮助,下面是一些类似示例的手册。形成一个布尔选择掩码:
mask = ~((x > 40) | (x < -40) | (y > 20) | (y < -20))
当
x
是一个NumPy数组时,(x>40)
返回一个与x
形状相同的布尔数组,该数组为True
,其中x
的元素大于40
注意使用|
表示按位or,使用~
表示非
(布尔求反)
或者,通过,您可以使用
mask = ((x <= 40) & (x >= -40) & (y <= 20) & (y >= -20))
屈服
In [35]: x
Out[35]: array([30])
In [36]: y
Out[36]: array([10])
与
为了完整起见,这里有一个基于itertools的解决方案 考虑以下坐标列表:
x = [-50, -50, -10, 0, 10, 50, 50, -10, -10, 0, 10, 40]
y = [-50, -20, -50, 50, -50, 20, 50, -20, -10, 0, 20, 10]
我们的目标是在n
索引中设置一个值为True
的布尔掩码,其中x[n]
和y[n]
位于特定间隔,而False
位于其他位置。间隔的边界为:
xmin, xmax = -40, 40
ymin, ymax = -20, 20
我们可以通过列表创建这样一个掩码:
mask = [xmin <= i <= xmax and ymin <= j <= ymax for (i, j) in zip(x, y)]
演示:
基本上,我所做的就是将第二个for循环移动到第一个for循环中,当1为flaseI时删除两个坐标,我看到了背后的逻辑,但是当我尝试代码时,我得到了这个错误,ValueError:list.remove(x):x不在列表中是的,我没有尝试它,其中有一些fualts,我正在尝试找出它谢谢,非常有用!尝试过了,但我得到一个错误,说TypeError:list索引必须是整数,而不是tupleAh,数组的形状或类型必须与我预期的不同。不过没问题,很高兴这有帮助。如果您演示如何创建示例输入数组,我可以修改。但是我喜欢@unutbu的答案,你应该这样做:)是的,可能是原因,但这让我对np有了深入的了解。在哪里,是的,我会跟随他的答案!恐怕这段代码不能像OP所期望的那样工作,因为您对
x
和y
的索引不同。函数的参数,其中
应该是@unutbu在这两种情况下提出的掩码。谢谢!学到了一些新东西!调用内置的list()
对x
和y
没有影响。事实上,如果去掉它,输出元组是完全相同的。如果你希望x
和y
成为列表,你应该这样调整你的代码:x,y=map(list,zip(*[(x,y)代表x,y在zip中(x,y)如果x-40和y-20])
我知道你在这里做什么,但是如果我想保留一个类似(30,10)的坐标怎么办?在您的方法中,列表是按数字排序的,对吗?还是会保留坐标?我真的应该试一试是的,最好自己试一试!但是,我更改了示例,以便更容易检查结果的正确性。
mask = ((x <= 40) & (x >= -40) & (y <= 20) & (y >= -20))
import numpy as np
x = [-50, -50, 30, 0, 50]
y = [-30, 0, 10, 30, 40]
# change the lists to NumPy arrays
x, y = np.asarray(x), np.asarray(y)
# mask = ~((x > 40) | (x < -40) | (y > 20) | (y < -20))
mask = ((x <= 40) & (x >= -40) & (y <= 20) & (y >= -20))
x, y = x[mask], y[mask]
In [35]: x
Out[35]: array([30])
In [36]: y
Out[36]: array([10])
In [37]: mask
Out[37]: array([False, False, True, False, False], dtype=bool)
x = [-50, -50, -10, 0, 10, 50, 50, -10, -10, 0, 10, 40]
y = [-50, -20, -50, 50, -50, 20, 50, -20, -10, 0, 20, 10]
xmin, xmax = -40, 40
ymin, ymax = -20, 20
mask = [xmin <= i <= xmax and ymin <= j <= ymax for (i, j) in zip(x, y)]
from itertools import compress
x_clipped = list(compress(x, mask))
y_clipped = list(compress(y, mask))
In [117]: mask
Out[117]: [False, False, False, False, False, False, False, True, True, True, True, True]
In [118]: x_clipped
Out[118]: [-10, -10, 0, 10, 40]
In [119]: y_clipped
Out[119]: [-20, -10, 0, 20, 10]