从numpy数组中的每个字符串中提取第一个字母

2024-10-02 18:16:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了一个巨大的numpy数组,其中的元素是字符串。我喜欢用字符串的第一个字母替换字符串。例如,如果

C[0] = 'A90CD'

我想换成

C[0] = 'A'

简而言之,我在考虑在一个循环中应用正则表达式,我有一个正则表达式字典,比如

'^A.+$' => 'A'

'^B.+$' => 'B' etc

如何将此regex应用于numpy数组?或者有没有更好的方法来达到同样的效果?在


Tags: 方法字符串numpy元素字典字母etc数组
1条回答
网友
1楼 · 发布于 2024-10-02 18:16:57

这里不需要正则表达式。只需使用astype-

v = np.array(['abc', 'def', 'ghi'])

^{pr2}$

或者,您可以更改它的view和步幅。这里有一个稍微优化的版本,用于同等大小的字符串。-在

>>> v.view('<U1')[::len(v[0])]
array(['a', 'd', 'g'],
      dtype='<U1')

这里是.view方法的更一般化版本,但它适用于长度不同的字符串数组。感谢保罗·潘泽尔的suggestion-

>>> v.view('<U1').reshape(v.shape + (-1,))[:, 0]
array(['a', 'd', 'g'],
      dtype='<U1')

性能

y = np.array([x * 20 for x in v]).repeat(100000)

y.shape
(300000,)

len(y[0])   # they're all the same length - `abcabcabc...`
60

现在,时间安排-

# `astype` conversion

%timeit y.astype('<U1')
100 loops, best of 3: 5.03 ms per loop

# `view` for equal sized string arrays 

%timeit y.view('<U1')[::len(y[0])]
100000 loops, best of 3: 2.43 µs per loop

# Paul Panzer's version for differing length strings

%timeit y.view('<U1').reshape(y.shape + (-1,))[:, 0]
100000 loops, best of 3: 3.1 µs per loop

view方法的速度大大快于eh3>

但是,请谨慎使用,因为内存是共享的。在


如果您对找到第一个字母的更通用的解决方案感兴趣(不管它可能在哪里),我认为最快/最简单的方法是使用re模块,编译一个模式并在列表理解中搜索。在

>>> p = re.compile('[a-zA-Z]')
>>> [p.search(x).group() for x in v]
['a', 'd', 'g']

而且,它在上面的相同设置下的性能-

%timeit [p.search(x).group() for x in y]
1 loop, best of 3: 320 ms per loop

相关问题 更多 >