Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以并行方式从数组中删除条目_Python_Arrays_List_Numpy - Fatal编程技术网

Python 以并行方式从数组中删除条目

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和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"
    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]