numpy中的有效分组

2024-04-19 08:23:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大约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]
]

最后两个列表保留了元素在原始列表中出现的顺序。这是我的偏好,但不是必须的。例如,由

[
 [-1, -1],
 [-1, -1],
 [-1,  0],
 [-1,  1]
]

…和

[
 [ 0, -1],
 [ 0, -1],
 [ 0,  0],
 [ 0,  1],
 [ 1, -1],
 [ 1,  0],
]

…也可以接受。你知道吗


换句话说,一组中的所有成对元素的第一个位置应该是-1,而另一组中的所有元素的第一个位置应该是0或1


Tags: 方法numpy元素编辑数据结构类型列表顺序
3条回答

你可以自己动手! 我看到的唯一的效率是生成器或类似的东西,它以计算时间为代价节省内存

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)

不如用这个条件两次来检查正负两方面

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]]
import numpy as np
a = np.random.randint(-1, 2, size=(10, 2))

print(a)
[[ 0  0]
 [ 1  1]
 [ 1  1]
 [-1 -1]
 [ 0 -1]
 [ 1  1]
 [-1  1]
 [-1  0]
 [ 1 -1]
 [ 1  1]]

minus, zero, one = [np.array([r for r in a if r[0] == c]) for c in [-1, 0, 1]]


print(minus)
[[-1 -1]
 [-1  1]
 [-1  0]]
print(zero)
[[ 0  0]
 [ 0 -1]]
print(one)
[[ 1  1]
 [ 1  1]
 [ 1  1]
 [ 1 -1]
 [ 1  1]]

相关问题 更多 >