为什么numpy在数组转换过程中将浮点数转换为字符串?

lsmepo6l  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(121)

我看到一些奇怪的东西。我有一个字符串的初始Python列表,您可以将字符串视为表中的行,第一行包含标题标签。我想把它放在一个numpy数组中。然而,当我将python列表转换为numpy数组时,列表中的值似乎被转换回字符串,除非我在numpy数组中不包含标题行。代码如下:

import numpy as np
mylist = ['Col1,Col2,Col3,Label','1,2,3,0','2,2,2,0','3,3,3,0']
X = []

for line in range(len(mylist)):
    sp = mylist[line].split(',')
    if line != 0:
        sp = [float(element) for element in sp]
        X.append(sp)
    else:
        # Header labels
        X.append(sp)
        
print(X)     
W = np.array(X)
print(W)

字符串
您可以在这里看到输出,其中第一行是在将列表转换为numpy数组之前,第二行是在转换之后。

[['Col1', 'Col2', 'Col3', 'Label'], [1.0, 2.0, 3.0, 0.0], [2.0, 2.0, 2.0, 0.0], [3.0, 3.0, 3.0, 0.0]]
[['Col1' 'Col2' 'Col3' 'Label']
 ['1.0' '2.0' '3.0' '0.0']
 ['2.0' '2.0' '2.0' '0.0']
 ['3.0' '3.0' '3.0' '0.0']]


如果我删除了header行的附加,那么它就可以工作了...当然没有header数组,但是类型是正确的:

mylist = ['Col1,Col2,Col3,Label','1,2,3,0','2,2,2,0','3,3,3,0']
X = []

for line in range(len(mylist)):
    sp = mylist[line].split(',')
    if line != 0:
        sp = [float(element) for element in sp]
        X.append(sp)
        
print(X)     
W = np.array(X)
print(W)


输出量:

[[1.0, 2.0, 3.0, 0.0], [2.0, 2.0, 2.0, 0.0], [3.0, 3.0, 3.0, 0.0]]
[[1. 2. 3. 0.]
 [2. 2. 2. 0.]
 [3. 3. 3. 0.]]

jhiyze9q

jhiyze9q1#

当将字符串和数字的列表转换为numpy数组时,数组将被设置为字符串dtype(在本例中为'<U32'),以便它们都是相同的数据类型。如果你想要一个字符串和数字的混合,那么你可以告诉numpy用dtype=object创建数组。但是numpy的速度只有在使用一致的数据类型时才能实现,最好是数值数据类型。

W = np.array(X, dtype=object)

字符串
如果你想要混合数据类型,你最好使用python列表。或者,您的示例似乎更适合pandas,您可以使用指定的列名和数据创建DataFrame

dfddblmv

dfddblmv2#

numpy是用C编写的,因此,在大多数情况下,numpy的行为与C数组非常相似。这意味着numpy数组有一个特定的类型,数组中的所有内容都必须是该类型。因此,当您将头文件添加到W时,它会自动将数组的类型设置为字符串,并尝试将添加到其中的任何内容也转换为字符串。这就是为什么数字在添加时转换为字符串的原因。
这与python列表的工作方式不同,因为它们没有任何特定的类型,允许您在同一列表中混合和匹配不同的类型。
要解决这个问题,您可以将W的类型设置为对象,这样它就可以接受任何类型的对象:

W = np.array(X, dtype="object")

字符串
注意,这将使你的代码稍微慢一点,因为现在numpy不会知道数组中的项目的类型。但如果尺寸很小,那就不重要了。
或者,您可以有两个单独的数组,一个是列标题,另一个是实际值。这样,你将保留更多numpy提供的加速:

headers = np.array(X[0], dtype=str)
values = np.array(X[1:], dtype=float)

相关问题