为什么vstack会改变元素的类型?我该如何解决这个问题?

时间:2017-06-30 12:44:20

标签: python arrays string list numpy

我有一些列表,例如

list1 = ['hi',2,3,4]
list2 = ['hello', 7,1,8]
list3 = ['morning',7,2,1]

'hi','hello'和'morning'是字符串,其余是数字。

然而,我尝试将它们叠加为:

matrix = np.vstack((list1,list2,list3))

但是数字的类型变成了字符串。特别是它们变为numpy_str

我该如何解决这个问题?我尝试更换物品,我尝试改变它们的类型,没有任何作用

修改

我在上面犯了一个错误!在我原来的问题中,第一个列表实际上是一个标题列表,例如

list1 = ['hi', 'number of hours', 'number of days', 'ideas']

所以第一列(在垂直堆叠的数组中)是一列字符串。其他列的字符串作为第一个元素,然后是数字。

2 个答案:

答案 0 :(得分:2)

由于number可以写成字符串,但字符串不能写为数字,因此matrix将包含字符串类型的所有元素。

如果您想要一个整数矩阵,您可以: 1-提取与您的数字对应的子矩阵,然后将其映射为整数2-或者您可以直接从列表中提取数字并将其叠加。

import numpy as np
list1 = ['hi',2,3,4]
list2 = ['hello', 7,1,8]
list3 = ['morning',7,2,1]

matrix = np.vstack((list1,list2,list3))

# First
m = map(np.int32,matrix[:,1:])
# [array([2, 3, 4], dtype=int32), array([7, 1, 8], dtype=int32), array([7, 2, 1], dtype=int32)]

# Second
m = np.vstack((list1[1:],list2[1:],list3[1:]))
# [[2 3 4] [7 1 8] [7 2 1]]

修改(回复评论)

我将调用标题列表list0

list0 = ['hi', 'nb_hours', 'nb_days', 'ideas']

基本上是相同的想法:

1-堆叠所有然后提取子矩阵(这里我们既没有第一行也没有第一列:[1:,1:]

matrix = np.vstack((list0,list1,list2,list3))
matrix_nb = map(np.int32,matrix[1:,1:])

2-直接不堆叠list0并堆叠所有其他列表(第一个元素[1:]除外):

m = np.vstack((list1[1:],list2[1:],list3[1:]))

答案 1 :(得分:2)

您可以使用Pandas DataFrames,它们允许异构数据:

>>> pandas.DataFrame([list1, list2, list3])

         0  1  2  3
0       hi  2  3  4
1    hello  7  1  8
2  morning  7  2  1

如果要为列命名,也可以这样做:

pandas.DataFrame([list1, list2, list3], columns=list0)

        hi  nb_hours  nb_days  ideas
0       hi         2        3      4
1    hello         7        1      8
2  morning         7        2      1