Python numpy中的有效分组

Python numpy中的有效分组,python,numpy,Python,Numpy,我有一个大约106对的列表,其中每一对的元素是-1、0或1: [ [ 0, 1], [-1, -1], [ 0, -1], [ 1, 0], ... ] 我想根据对的第一个元素是否为-1将这些对分成两组(即对的列表) 有没有办法用numpy有效地做到这一点 尽管我在上面使用了术语和符号,但事实上,我不知道对的实际类型和对的“列表”。使用任何numpy或python数据结构都可以获得最高效的解决方案。(但请不要熊猫。) 编辑: 例如,如果对的初始列表为 [ [ 0, -1],

我有一个大约106对的列表,其中每一对的元素是-1、0或1:

[
 [ 0,  1],
 [-1, -1],
 [ 0, -1],
 [ 1,  0],
 ...
]
我想根据对的第一个元素是否为-1将这些对分成两组(即对的列表)

有没有办法用numpy有效地做到这一点

尽管我在上面使用了术语和符号,但事实上,我不知道对的实际类型和对的“列表”。使用任何numpy或python数据结构都可以获得最高效的解决方案。(但请不要熊猫。)

编辑:

例如,如果对的初始列表为

[
 [ 0, -1],
 [ 0, -1],
 [ 1, -1],
 [-1, -1],
 [ 1,  0],
 [-1,  1],
 [-1, -1],
 [ 0,  0],
 [ 0,  1],
 [-1,  0]
]
…可接受的结果将包括两个列表

[
 [-1, -1],
 [-1,  1],
 [-1, -1],
 [-1,  0]
]
…和

[
 [ 0, -1],
 [ 0, -1],
 [ 1, -1],
 [ 1,  0],
 [ 0,  0],
 [ 0,  1]
]
[
 [ 0, -1],
 [ 0, -1],
 [ 0,  0],
 [ 0,  1],
 [ 1, -1],
 [ 1,  0],
]
最后两个列表保留了元素在原始列表中的顺序。这是我的偏好,但不是必要的。例如,由以下内容组成的解决方案:

[
 [-1, -1],
 [-1, -1],
 [-1,  0],
 [-1,  1]
]
…和

[
 [ 0, -1],
 [ 0, -1],
 [ 1, -1],
 [ 1,  0],
 [ 0,  0],
 [ 0,  1]
]
[
 [ 0, -1],
 [ 0, -1],
 [ 0,  0],
 [ 0,  1],
 [ 1, -1],
 [ 1,  0],
]
…也可以接受



换句话说,一个组中的所有对在其第一个位置上都应该有-1,而另一个组中的所有元素在其第一个位置上都应该有0或1。

只使用两次条件来检查正负值,怎么样

import numpy as np

a = np.array([ [ 0, -1], [ 0, -1], [ 1, -1], [-1, -1], [ 1,  0], 
                    [-1,  1], [-1, -1], [ 0,  0], [ 0,  1], [-1,  0]])

pos = a[a[:, 0]!=-1]
neg = a[a[:, 0]==-1]

print (pos)
# [[ 0 -1]
#  [ 0 -1]
#  [ 1 -1]
#  [ 1  0]
#  [ 0  0]
#  [ 0  1]]

print (neg)
# [[-1 -1]
#  [-1  1]
#  [-1 -1]
#  [-1  0]]
你可以自己做! 我看到的唯一的效率是生成器或类似的东西,它将以计算时间为代价节省内存

def sanitize(yllp):#yllp: list-like of pair
    y = yield
    yield
    for x in yllp:
        if (x[0] in {0,1} and y != -1) or x[0] == -1 == y:
           yield x 
例如:

L = [
     (-1,1), 
     (0,1), 
     (0,1), 
     (-1,1), 
     (-1,0), 
     (-1,-1), 
     (0,0), 
     (1,0)
    ]

#get list starting by 0 or 1
w=sanitize(L)    
w.next()
w.send(0)
for i in w:print(i)

#get list starting by -1
t=sanitize(L)
t.next()
t.send(-1)
for i in t:print(i)

你所说的有效解决方案是什么意思?高效wrt到什么?内存/存储?计算复杂度?例如,为什么一个简单的for循环不能将列表一分为二,效率很高?请在您的问题中添加预期的输出,因为这会产生与您预期不符的答案。条件索引的可能重复比我下面的答案快吗?@freude:我不会这么说,是的,事实上,情况有所不同。在我看来,你和我使用的索引是一种简单的方法。不过,我觉得很有趣,为什么你没有使用积极的索引,而是求助于
delete
。关于你的第一个评论,我没有进行任何时间研究。请随意这样做。我已经展示了两种相同的方法,它们都不做偏好选择。我很确定时间是平等的。但如果你认为你对讨论做出了重大贡献,那就这样吧。这很好。在这个二进制分组中,我们可以构造一个
mask=a[:,0]=-1
,然后应用
a[mask]
a[~mask]
。速度更好。@hpaulj:谢谢你的建议你的
列表(w)
生成的
不是-1
组,但是另一个组在哪里呢?对于另一个组,它很简单:w=消毒(L)w.下一个()w.发送(-1)用于w:print(i)我刚刚编辑了代码