numpy 中用于字符串数组的自定义矢量化
Custom Vectorization in numpy for string arrays
我正尝试在 numpy string arrays
上申请 vectorization with custom function
。
示例:
import numpy
test_array = numpy.char.array(["sample1-sample","sample2-sample"])
numpy.char.array(test_array.split('-'))[:,0]
操作:
chararray([b'sample1', b'sample2'], dtype='|S7')
但是这些都是in-built
的功能,有没有其他的方法可以实现vectorization with custom functions
。例如,具有以下功能:
def custom(text):
return text[0]
numpy
没有实现快速字符串方法(就像它对数字数据类型所做的那样)。所以 np.char
代码更多的是为了方便而不是为了性能。
In [124]: alist=["sample1-sample","sample2-sample"]
In [125]: arr = np.array(alist)
In [126]: carr = np.char.array(alist)
一个简单的列表理解与你的代码:
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
:
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
:
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
函数通常生成字符串 dtype 数组,但 split 创建列表的对象 dtype 数组:
In [141]: np.char.split(arr, '-')
Out[141]:
array([list(['sample1', 'sample']), list(['sample2', 'sample'])],
dtype=object)
对象 dtype 数组本质上是列表。
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
。
我正尝试在 numpy string arrays
上申请 vectorization with custom function
。
示例:
import numpy
test_array = numpy.char.array(["sample1-sample","sample2-sample"])
numpy.char.array(test_array.split('-'))[:,0]
操作:
chararray([b'sample1', b'sample2'], dtype='|S7')
但是这些都是in-built
的功能,有没有其他的方法可以实现vectorization with custom functions
。例如,具有以下功能:
def custom(text):
return text[0]
numpy
没有实现快速字符串方法(就像它对数字数据类型所做的那样)。所以 np.char
代码更多的是为了方便而不是为了性能。
In [124]: alist=["sample1-sample","sample2-sample"]
In [125]: arr = np.array(alist)
In [126]: carr = np.char.array(alist)
一个简单的列表理解与你的代码:
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
:
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
:
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
函数通常生成字符串 dtype 数组,但 split 创建列表的对象 dtype 数组:
In [141]: np.char.split(arr, '-')
Out[141]:
array([list(['sample1', 'sample']), list(['sample2', 'sample'])],
dtype=object)
对象 dtype 数组本质上是列表。
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
。