将numpy列拆分为两列,并将它们保留在原始数组中

时间:2014-04-08 02:11:59

标签: python arrays numpy

我有一个numpy数组,有3列。有100,000行,但这里是前两行:

 burger flipper  part time  12-5.00
 spam flipper    full time  98-10.00

问题是,工作代码(12和98)已经以某种方式与小时工资(5.00和10.00)相结合。

numpy中是否有一种简单的方法可以将此列拆分为两个,并删除不必要的“ - ”字符,如:

 burger flipper  part time  12  5.00
 spam flipper    full time  98  10.00

提前致谢。

2 个答案:

答案 0 :(得分:2)

使用hstack

进行此操作的一种方法
import numpy as np
a = np.array([['burger flipper',  'part time',  '12-5.00'],
             ['spam flipper',    'full time',  '98-10.00']])
a = np.hstack((a[:,:2], map(lambda x: x.split('-'), a[:,2])))
print a

输出:

[['burger flipper' 'part time' '12' '5.00']
 ['spam flipper' 'full time' '98' '10.00']]

一点解释:

  1. 函数numpy.hstack允许您水平堆叠多个numpy数组。例如,

    np.hstack((a[:,[0,1]], a[:,[2]]))
    

    生成具有三列的原始数组a。请注意,在a[:,[2]]中使用括号,[a:,2]将无效,因为它会生成一维数组(len(a[:,2].shape)等于1)。

  2. map语句将函数lambda x: x.split('-')应用于数组的有问题列(即第3列)。每次调用lambda函数都会返回一个包含分离的工作代码和工资的列表,例如['12', '5.00']。因此,map语句会生成一个类似于[['12', '5.00'], ['98', '10.00']]的列表。在送到hstack时,可以将其转换为包含2列的numpy数组。

  3. 代码hstack原始数组的前两列,以及通过map获得的列表列表,从而生成一个类似于您最终想要的数组。

答案 1 :(得分:1)

map(lambda x:x.split('-'),a [:,2])现在给出一个列表,而不是两列,从而导致以下错误: ValueError::所有输入数组的维数必须相同

需要将以前的代码更改为:

import numpy as np
a = np.array([['burger flipper',  'part time',  '12-5.00'],
             ['spam flipper',    'full time',  '98-10.00']])
a_newcolumns = np.hstack((map(lambda x: x.split('-'), a[:, 2]))).reshape(a.shape[0], 2)
# need to reshape the list into a two column numpy array
a = np.hstack((a[:, :2], a_newcolumns))
print a