【问题标题】:Why does vstack change the type of the elments? And how do I solve this?为什么 vstack 会改变元素的类型?我该如何解决这个问题?
【发布时间】:2017-12-04 10:25:03
【问题描述】:

我有一些列表,例如

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']

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

【问题讨论】:

  • 要在数组中混合字符串和整数,请使用结构化数组或对象数组,如最近的stackoverflow.com/q/44831502
  • np.vstack 通过np.atleast_2d 传递每个输入列表,而np.atleast_2d 又使用np.array。看np.array(list1)

标签: python arrays string list numpy


【解决方案1】:

您可以使用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

【讨论】:

  • 命名行我猜是rows = listNamesRows ?
  • 它的index=listNamesRows
【解决方案2】:

由于数字可以写成字符串,但字符串不能写成数字,所以你的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:]))

【讨论】:

  • @Nuageoux 如果第一个列表 list1 是“标题”列表,我该怎么办?例如 `list1 = ['hi', '小时数', '天数', 'ideas'] ?
  • @Euler_Salter 我将我的答案编辑为 headingslist0。输出是一样的
  • 谢谢!然而,这解决了问题,没有解决它,我想!我的意思是,我提取我需要的东西,这很好。然而,重要的列和行的标题。我希望这个数组像一张桌子。鉴于此,您会说还有另一种创建表格的方法吗?
  • 另外,这并不能解决问题,因为它们仍然是字符串,如果你去检查一下!
  • 如果它仍然很重要,您可以将列表的标题/第一个元素保留为字符串列表,您可以将它们与整数 numpy.array 的索引匹配。或者,您保留整个字符串表。不可能混合使用它们(使用 numpy.array)。否则你可以看看 Pandas。我不明白你为什么说它仍然是字符串。不是,我检查了我的例子。
猜你喜欢
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 2012-03-06
相关资源
最近更新 更多