我正在尝试从这些字符串中提取第一个(或唯一的)浮点或整数:
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
现在我已经阅读了关于使用布尔数组进行索引的所有内容;但我无法让它发挥作用。
这很简单,我不认为笨拙地找出一个正则表达式是值得的,但复杂到足以让它给我带来麻烦。
答案 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