【问题标题】:Generating class name list based on class index list根据类索引列表生成类名列表
【发布时间】:2018-12-07 13:12:22
【问题描述】:

我正在与来自sklearn.datasetsiris_dataset 一起玩 我想生成类似于iris_dataset['target'] 的列表,但要使用类名而不是索引。 我的做法:

from sklearn.datasets import load_iris
iris_dataset=load_iris()
y=iris_dataset.target
print("Iris target: \n {}".format(iris_dataset.target))
unique_y = np.unique(y)
class_seq=['']
class_seq=class_seq*y.shape[0]

for i in range(y.shape[0]):
    for (yy,tn) in zip(unique_y,iris_dataset.target_names):
        if y[i]==yy:
            class_seq[i]=tn          

print("Class sequence: \n {}".format(class_seq))

但我不想循环遍历y 的所有元素,如何更好地做到这一点?

结果是我需要这个pandas.radviz 情节的列表才能有一个合适的图例:

pd.plotting.radviz(iris_DataFrame,'class_seq',color=['blue','red','green'])

并且进一步将它用于任何其他数据集。

【问题讨论】:

  • 实际上最好使用第二个答案中给出的掩码,因为使用 np.arrays 而不是列表更容易,这是我在制定问题时的错误

标签: python-3.x pandas numpy iris-dataset


【解决方案1】:

你可以通过循环 iris_dataset.target_names.size 来做到这一点。这只是大小 3,因此对于大型 y 数组应该更快。

class_seq = np.empty(y.shape, dtype=iris_dataset.target_names.dtype)

for i in range(iris_dataset.target_names.size):
    mask = y == i
    class_seq[mask] = iris_dataset.target_names[i]

如果您想将class_seq 作为列表:class_seq = list(class_seq)

【讨论】:

    【解决方案2】:

    你可以通过列表理解来做到这一点。

    class_seq = [ iris_dataset.target_names[i] for i in iris_dataset.target]
    

    或使用地图

    class_seq = list(map(lambda x : iris_dataset.target_names[x], iris_dataset.target))
    

    【讨论】:

      猜你喜欢
      • 2016-04-19
      • 2014-09-24
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 2017-04-18
      • 2019-12-10
      • 2013-03-01
      相关资源
      最近更新 更多