用一个数字替换 numpy 数组中的字符串

7

我有一个numpy数组

z = array(['Iris-setosa', 'Iris-setosa', 'Iris-setosa', 'Iris-setosa','Iris-versicolor', 'Iris-versicolor', 'Iris-versicolor','Iris-virginica', 'Iris-virginica', 'Iris-virginica'])

I want to replace

Iris-setosa -0
Iris-versicolor - 1
Iris-virginica - 2

应用逻辑回归。

最终输出结果应为

z = [ 0, 0 ,.. 1,1,.. 2,2,..]

有没有简单的方法可以执行这个操作,而不是通过迭代数组并使用替换命令?

1
不完全是你想要的,但也许有另一个想法:pd.Series(z, dtype="category"),请参阅https://pandas.pydata.org/pandas-docs/stable/categorical.html。 - stephan
你的例子不够明确。这些字符串是按照出现顺序编号还是替换为给定值? - Mr. T
你想要随后应用逻辑回归并不意味着这是一个“机器学习”问题;请不要滥用标签(已删除)。 - desertnaut
4个回答

14

使用factorize函数:

a = pd.factorize(z)[0].tolist()
print (a)
[0, 0, 0, 0, 1, 1, 1, 2, 2, 2]

或者numpy.unique函数:

a = np.unique(z, return_inverse=True)[1].tolist()
print (a)
[0, 0, 0, 0, 1, 1, 1, 2, 2, 2]

@Sanjay - 很高兴能帮助到你! - jezrael

11
您可以使用字典:
my_dict = {'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2}

那么使用列表推导式:
z = [my_dict[zi] for zi in z]

那真的很有帮助。在执行操作之前,我需要将它从numpy数组转换为列表。 - Sanjay
这种语法糖对我现在非常有用。 - mindlid

0
你是在尝试进行逻辑回归时计算出现次数吗?
如果是,你也可以使用以下方法。
import collections
z = ['Iris-setosa', 'Iris-setosa', 'Iris-setosa', 'Iris-setosa','Iris-versicolor', 'Iris-versicolor', 'Iris-versicolor','Iris-virginica', 'Iris-virginica', 'Iris-virginica']
print (collections.Counter(z))

它将打印如下:

Counter({'Iris-setosa': 4, 'Iris-versicolor': 3, 'Iris-virginica': 3})

如果你想以另一种方式打印,可以按照以下步骤操作:
import collections
z = ['Iris-setosa', 'Iris-setosa', 'Iris-setosa', 'Iris-setosa','Iris-versicolor', 'Iris-versicolor', 'Iris-versicolor','Iris-virginica', 'Iris-virginica', 'Iris-virginica']
for item in collections.Counter(z):
    print(str(item)+ ' ' + str(collections.Counter(z)[item]))

输出结果将会是:

Iris-setosa 4
Iris-versicolor 3
Iris-virginica 3

-1
[list(set(z)).index(val) for val in z]

简而言之,将一个集合从z中转换为只包含唯一值的集合,然后将该集合转换为列表进行索引,最后使用列表推导式获取最终列表。如果你有一个非常大的字符串列表,我建议在列表推导式之外将list(set(z))设置为一个变量。

我得到的输出是 [2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2],但是难道不应该将Iris-setosa设置为0吗? - Sruthi
这个怎么样?[list(np.unique(z)).index(val) for val in z] - Louis Barto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接