我有一个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
提前致谢。
答案 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']]
一点解释:
函数numpy.hstack允许您水平堆叠多个numpy数组。例如,
np.hstack((a[:,[0,1]], a[:,[2]]))
生成具有三列的原始数组a
。请注意,在a[:,[2]]
中使用括号,[a:,2]
将无效,因为它会生成一维数组(len(a[:,2].shape)
等于1)。
map
语句将函数lambda x: x.split('-')
应用于数组的有问题列(即第3列)。每次调用lambda函数都会返回一个包含分离的工作代码和工资的列表,例如['12', '5.00']
。因此,map
语句会生成一个类似于[['12', '5.00'], ['98', '10.00']]
的列表。在送到hstack
时,可以将其转换为包含2列的numpy数组。
代码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