2024-10-02 18:16:57 发布
网友
我得到了一个巨大的numpy数组,其中的元素是字符串。我喜欢用字符串的第一个字母替换字符串。例如,如果
C[0] = 'A90CD'
我想换成
C[0] = 'A'
简而言之,我在考虑在一个循环中应用正则表达式,我有一个正则表达式字典,比如
'^A.+$' => 'A''^B.+$' => 'B' etc
'^A.+$' => 'A'
'^B.+$' => 'B' etc
如何将此regex应用于numpy数组?或者有没有更好的方法来达到同样的效果?在
这里不需要正则表达式。只需使用astype-
astype
v = np.array(['abc', 'def', 'ghi'])
或者,您可以更改它的view和步幅。这里有一个稍微优化的版本,用于同等大小的字符串。-在
view
>>> v.view('<U1')[::len(v[0])] array(['a', 'd', 'g'], dtype='<U1')
这里是.view方法的更一般化版本,但它适用于长度不同的字符串数组。感谢保罗·潘泽尔的suggestion-
.view
>>> 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
但是,请谨慎使用,因为内存是共享的。在
如果您对找到第一个字母的更通用的解决方案感兴趣(不管它可能在哪里),我认为最快/最简单的方法是使用re模块,编译一个模式并在列表理解中搜索。在
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
这里不需要正则表达式。只需使用
^{pr2}$astype
-或者,您可以更改它的
view
和步幅。这里有一个稍微优化的版本,用于同等大小的字符串。-在这里是
.view
方法的更一般化版本,但它适用于长度不同的字符串数组。感谢保罗·潘泽尔的suggestion-性能
现在,时间安排-
view
方法的速度大大快于eh3>但是,请谨慎使用,因为内存是共享的。在
如果您对找到第一个字母的更通用的解决方案感兴趣(不管它可能在哪里),我认为最快/最简单的方法是使用
re
模块,编译一个模式并在列表理解中搜索。在而且,它在上面的相同设置下的性能-
相关问题 更多 >
编程相关推荐