In [192]: alist = ['abc', 'bac', 'foo', 'az', 'bar', 'ac']
In [193]: arr = np.array(alist)
直接的列表推导:
In [194]: [a[0]=='a' for a in alist]
Out[194]: [True, False, False, True, False, True]
它也可以与数组一起使用,但速度较慢(在数组上进行迭代比在列表上更慢):
In [195]: timeit [a[0]=='a' for a in alist]
707 ns ± 5.61 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [196]: timeit [a[0]=='a' for a in arr]
4.88 µs ± 9.44 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
字符串方法 startswith
也是一种选择:
In [197]: [a.startswith('a') for a in alist]
Out[197]: [True, False, False, True, False, True]
In [198]: timeit [a.startswith('a') for a in alist]
1.14 µs ± 11.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
numpy
没有自己的字符串处理工具。它有np.char
函数,但它们只是应用Python字符串方法,没有速度提升:
In [200]: np.char.startswith(arr, 'a')
Out[200]: array([ True, False, False, True, False, True])
In [201]: timeit np.char.startswith(arr, 'a')
12.5 µs ± 297 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
如果您从列表的开头和结尾开始,则可获得最佳速度。 对数组进行迭代或将布尔列表转换回数组需要时间。
重新阅读您的代码,我发现您想要选择项目,而不仅仅是创建掩码。那么列表推导式应该是:
In [215]: [a for a in alist if a[0]=='a']
Out[215]: ['abc', 'az', 'ac']
In [216]: timeit [a for a in alist if a[0]=='a']
645 ns ± 3.36 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
====
关于你的代码失败了,
[:]
在任何一个表达式中都没有起到作用。
In [213]: arr[:]
Out[213]: array(['abc', 'bac', 'foo', 'az', 'bar', 'ac'], dtype='<U3')
所以你只是检查
arr
的第一个元素是否为'a'。你没有测试每个元素的第一个字符串。
In [214]: arr[0]=='a'
Out[214]: False