我看到一些奇怪的东西。我有一个字符串的初始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.]]
型
2条答案
按热度按时间jhiyze9q1#
当将字符串和数字的列表转换为numpy数组时,数组将被设置为字符串
dtype
(在本例中为'<U32'
),以便它们都是相同的数据类型。如果你想要一个字符串和数字的混合,那么你可以告诉numpy用dtype=object
创建数组。但是numpy的速度只有在使用一致的数据类型时才能实现,最好是数值数据类型。字符串
如果你想要混合数据类型,你最好使用python列表。或者,您的示例似乎更适合pandas,您可以使用指定的列名和数据创建
DataFrame
。dfddblmv2#
numpy是用C编写的,因此,在大多数情况下,numpy的行为与C数组非常相似。这意味着numpy数组有一个特定的类型,数组中的所有内容都必须是该类型。因此,当您将头文件添加到
W
时,它会自动将数组的类型设置为字符串,并尝试将添加到其中的任何内容也转换为字符串。这就是为什么数字在添加时转换为字符串的原因。这与python列表的工作方式不同,因为它们没有任何特定的类型,允许您在同一列表中混合和匹配不同的类型。
要解决这个问题,您可以将
W
的类型设置为对象,这样它就可以接受任何类型的对象:字符串
注意,这将使你的代码稍微慢一点,因为现在numpy不会知道数组中的项目的类型。但如果尺寸很小,那就不重要了。
或者,您可以有两个单独的数组,一个是列标题,另一个是实际值。这样,你将保留更多numpy提供的加速:
型