我有一个numpy数组x
和一个标记列表cls
,它保留x
的顺序,并记录每个元素所属的类。例如,对于两个不同的类x
和0
:
x = [47 21 16 19 38]
cls = [0 0 1 0 1]
意味着
1
属于一起,也意味着47, 21, 19
属于一起。有没有一种pythonic方法可以按类从
16, 38
中选择元素?现在我在做
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()
但我不敢相信没有比这更优雅的了。
最佳答案
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)
关于python - 当组已知时从numpy ndarray选择行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14938551/