这里不需要正则表达式。只需使用astype
将您的数组转换为一个1字节字符串即可 -
v = np.array(['abc', 'def', 'ghi'])
>>> v.astype('<U1')
array(['a', 'd', 'g'],
dtype='<U1')
或者,您可以更改其view
和步幅。以下是一个针对相等大小字符串稍微优化过的版本。
>>> v.view('<U1')[::len(v[0])]
array(['a', 'd', 'g'],
dtype='<U1')
这里是通用版本的.view
方法,适用于长度不同的字符串数组。感谢Paul Panzer提供的建议 -
>>> 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
%timeit y.view('<U1')[::len(y[0])]
100000 loops, best of 3: 2.43 µs per loop
:这是一个空段落标签。
%timeit y.view('<U1').reshape(y.shape + (-1,))[:, 0]
100000 loops, best of 3: 3.1 µs per loop
view
方法速度大大提高。
但是请谨慎使用,因为内存是共享的。
如果您对一种更通用的解决方案感兴趣,可以找到您的第一个字母(无论它在哪里),我建议最快/最简单的方法是使用 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
02AC9
这样的字符串的第一个字母? - Mr. T