Python中numpy字符串数组的功能掩码

时间:2015-09-23 07:09:03

标签: python arrays regex numpy indexing

我正在尝试从这些字符串中提取第一个(或唯一的)浮点整数

str1 = np.asarray('92834.1alksjdhaklsjh')
str2 = np.asarray'-987___-')
str3 = np.asarray'-234234.alskjhdasd')

其中,如果正确解析,我们应该

var1 = 92834.1   #float
var2 = -987      #int 
var3 = -234234.0 #float

使用numpy数组的“masking”属性,我想出了类似于任何str_变量的东西,例如:

>> ma1 = np.asarray([not str.isalpha(c) for c in str1.tostring()],dtype=bool)

array([ True,  True,  True,  True,  True,  True,  True, False, False,
     False, False, False, False, False, False, False, False, False,
     False, False], dtype=bool)

>> str1[ma1]

IndexError: too many indeces for array 

现在我已经阅读了关于使用布尔数组进行索引的所有内容;但我无法让它发挥作用。

这很简单,我不认为笨拙地找出一个正则表达式是值得的,但复杂到足以让它给我带来麻烦。

1 个答案:

答案 0 :(得分:1)

你不能创建一个具有不同类型的数组,如果你想在一个numpy数组对象中使用不同的类型,你可以使用record array并指定数组中的类型,但这里是一个更直接的方式您可以将numpy对象转换为字符串,并使用re.search来获取数字:

>>> float(re.search(r'[\d.-]+',str(str1)).group())
92834.1
>>> float(re.search(r'[\d.-]+',str(str2)).group())
-987.0
>>> float(re.search(r'[\d.-]+',str(str3)).group())
-234234.0

但是如果你想使用numpy方法,你需要先从你的字符串创建一个数组:

>>> st=str(str1)
>>> arr=np.array(list(st))
>>> mask=map(str.isalpha,st)
>>> mask
[False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True]

>>> arr[~mask]
array(['9', '2', '8', '3', '4', '.', '1'], 
      dtype='|S1')

然后将str.join方法与float

一起使用
>>> float(''.join(arr[~mask]))
92834.1