【问题标题】:Filter numpy array of strings过滤numpy字符串数组
【发布时间】:2018-07-31 17:26:46
【问题描述】:

我从 twitter 获得了一个非常大的数据集。我试图弄清楚如何在 numpy.环境是python解释器

>>tweets = [['buhari si good'], ['atiku is great'], ['buhari nfd sdfa atiku'], 
         ['is nice man that buhari']]
>>>filter(lambda x: 'buhari' in x[0].lower(), tweets) 
[['buhari si good'], ['buhari nfd sdfa atiku'], ['is nice man that buhari']]

我尝试了像下面这样的布尔索引,但数组变成了空

>>>tweet_arr = np.array([['buhari si good'], ['atiku is great'], ['buhari nfd sdfa atiku'], ['is nice man that buhari']])
>>>flat_tweets = tweet_arr[:, 0]
>>>flat_tweets
array(['buhari si good', 'atiku is great', 'buhari nfd sdfa atiku',
   'is nice man that buhari'], dtype='|S23')
>>>flat_tweets['buhari' in flat_tweets]
array([], shape=(0, 4), dtype='|S23')

我想知道如何过滤 numpy 数组中的字符串,我很容易在这里过滤偶数

>>> arr = np.arange(15).reshape((15,1))
>>>arr
array([[ 0],
   [ 1],
   [ 2],
   [ 3],
   [ 4],
   [ 5],
   [ 6],
   [ 7],
   [ 8],
   [ 9],
   [10],
   [11],
   [12],
   [13],
   [14]])
>>>arr[:][arr % 2 == 0]
array([ 0,  2,  4,  6,  8, 10, 12, 14])

谢谢

【问题讨论】:

  • 与第一个列表解决方案完全相同的方法适用于 NumPy 数组;这还不够吗?
  • @fuglede 我正在寻找 numpy 中最快的方法,因为我正在处理每天流式传输/更新的大型推文数据库。你会说我的第一个解决方案是最快的方法吗?
  • 如果它实际上至少比我在下面建议的要快,我不会感到惊讶,但您可以在您的数据集上计时,看看什么有效(例如使用 IPython's %timeit magic)。跨度>
  • np.char 具有将字符串方法应用于数组元素的函数,但它们并不比列表推导快多少。在大多数情况下,字符串 dtype 数组不提供比列表更快的处理。
  • @Adeyinka 如果您使用的是字符串,那么只使用普通 Python 可能会更快,因此列表理解方法将是理想的。 numpy 不针对字符串进行优化,它针对快速 numerical 操作

标签: python numpy


【解决方案1】:

如果你想坚持完全基于 NumPy 的解决方案,你可以这样做

from numpy.core.defchararray import find, lower
tweet_arr[find(lower(tweet_arr), 'buhari') != -1]

您在评论中提到您在这里寻找的是性能,因此应该注意这似乎比您自己提出的解决方案慢很多:

In [33]: large_arr = np.repeat(tweet_arr, 10000)

In [36]: %timeit large_arr[find(lower(large_arr), 'buhari') != -1]
54.6 ms ± 765 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [43]: %timeit list(filter(lambda x: 'buhari' in x.lower(), large_arr))
21.2 ms ± 219 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

事实上,普通的列表推导胜过这两种方法:

In [44]: %timeit [x for x in large_arr if 'buhari' in x.lower()]
18.5 ms ± 102 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2022-07-04
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2019-04-04
    相关资源
    最近更新 更多