3

我有一个 numpy 数组x和一个标签列表,cls它保留了 的顺序x,并记录了每个元素x所属的类。例如,对于两个不同的类01

x = [47 21 16 19 38]
cls = [0 0 1 0 1]

意思是47, 21, 19属于一起的,所以也是16, 38

有没有一种按类选择元素的pythonic方法x

现在我在做

for clusterId in np.unique(cls):
indices = [i for i in range(len(cls)) if cls[i]==clusterId]
print 'Class ', clusterId
for idx in indices:
    print '\t', x[idx,].tolist()

但我不敢相信没有比这更优雅的了。

4

1 回答 1

5

cls非常适合构建布尔索引数组:

>>> import numpy as np
>>> x = np.array([47, 21, 16, 19, 38])
>>> cls = np.array([0, 0, 1, 0, 1],dtype=bool)
>>> x[cls]
array([16, 38])
>>> x[~cls]
array([47, 21, 19])

请注意,如果cls还不是布尔数组,您可以使用ndarray.astype

>>> cls = np.array([0, 0, 1, 0, 1])
>>> x[cls]  #Not what you want
array([47, 47, 21, 47, 21])
>>> x[cls.astype(bool)]  #what you want.
array([16, 38])

在一般情况下,您有一个cls数组并且您只想选择具有该索引的元素:

>>> x[cls == 0]
array([47, 21, 19])
>>> x[cls == 1]
array([16, 38])

要查找您拥有的所有课程,您可以使用np.unique(cls)

于 2013-02-18T14:27:59.523 回答