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