首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串数组的numpy中的自定义向量化

字符串数组的numpy中的自定义向量化
EN

Stack Overflow用户
提问于 2021-10-05 14:13:30
回答 1查看 48关注 0票数 0

我正在尝试在numpy string arrays上应用vectorization with custom function

示例:

代码语言:javascript
复制
import numpy

test_array = numpy.char.array(["sample1-sample","sample2-sample"])

numpy.char.array(test_array.split('-'))[:,0]

操作:

代码语言:javascript
复制
chararray([b'sample1', b'sample2'], dtype='|S7')

但这些都是in-built函数,有没有其他的方法来实现vectorization with custom functions。示例,具有以下函数:

代码语言:javascript
复制
def custom(text):
    return text[0]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-05 15:59:47

numpy没有实现快速的字符串方法(就像它对数字数据类型那样)。因此,np.char代码更多的是为了方便而不是为了性能。

代码语言:javascript
复制
In [124]: alist=["sample1-sample","sample2-sample"]
In [125]: arr = np.array(alist)
In [126]: carr = np.char.array(alist)

一个简单的列表理解与你的代码:

代码语言:javascript
复制
In [127]: [item.split('-')[0] for item in alist]
Out[127]: ['sample1', 'sample2']
In [128]: np.char.array(carr.split('-'))[:,0]
Out[128]: chararray([b'sample1', b'sample2'], dtype='|S7')
In [129]: timeit [item.split('-')[0] for item in alist]
664 ns ± 32.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [130]: timeit np.char.array(carr.split('-'))[:,0]
20.5 µs ± 297 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

对于简单的字符串剪切任务,有一种快速的numpy方法--使用较短的dtype

代码语言:javascript
复制
In [131]: [item[0] for item in alist]
Out[131]: ['s', 's']
In [132]: carr.astype('S1')
Out[132]: chararray([b's', b's'], dtype='|S1')

但假设这只是一个示例,而不是您现实世界中的自定义操作,我建议使用列表。

np.char建议使用np.char函数和普通数组,而不要使用np.char.array。功能基本相同。但是使用上面的arr

代码语言:javascript
复制
In [140]: timeit np.array(np.char.split(arr, '-').tolist())[:,0]
13.8 µs ± 90.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

np.char函数通常会生成字符串数据类型数组,但split会创建列表的对象数据类型数组:

代码语言:javascript
复制
In [141]: np.char.split(arr, '-')
Out[141]: 
array([list(['sample1', 'sample']), list(['sample2', 'sample'])],
      dtype=object)

对象数据类型数组本质上是列表。

代码语言:javascript
复制
In [145]: timeit [item[0] for item in np.char.split(arr, '-').tolist()]
9.08 µs ± 27.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

您的代码相对较慢,因为将这个列表数组转换为新的chararray需要时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69452063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档