【问题标题】:Functional masking of numpy string array in PythonPython中numpy字符串数组的功能屏蔽
【发布时间】:2015-09-23 07:09:02
【问题描述】:

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

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 数组的“屏蔽”属性,我想出了类似 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 

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

这很简单,我认为花时间找出一个正则表达式并不值得,但又足够复杂,给我带来了麻烦。

【问题讨论】:

  • 没有 numpy 的类似算法 - ''.join([c for c in s if not c.isalpha()]) 。但请注意,如果字符串中有多个位置存在数字,则绝不会取出第一个浮点数/整数。
  • 我认为您可以在这里使用^.*?([+-]?\d*\.?\d+) 正则表达式。它对你有用吗?
  • @stribizhev - 正则表达式令人印象深刻(我的恐惧),但对于您链接的示例,它返回一个 int,当它需要返回一个解析的浮点数时。对于我的应用程序,正确输入类型很重要。我修改了your script 以表明我的意思。
  • 我认为-234234 是一个整数,而不是一个浮点数。您要求提取整数或浮点数。如果您只需要浮动,请使用 Kasra 的版本。

标签: python arrays regex numpy indexing


【解决方案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

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    相关资源
    最近更新 更多