替换 Numpy 字符串列表中的单个字符
Replace a single character in a Numpy list of strings
我有一个 Datetime64 对象的 Numpy 数组,我需要将其转换为特定的时间格式 yyyy-mm-dd,HH:MM:SS.SSS
Numpy 有一个名为 datetime_as_string
的函数,它输出 ISO8601 (yyyy-mm-ddTHH:MM:SS.SSS) 时间,这非常接近我想要的,唯一的区别是我想要的地方有一个 T一个逗号。
有没有办法快速将 "T" 换成“,”?这是一个示例数据集:
offset = np.arange(0, 1000)
epoch = np.datetime64('1970-01-01T00:00:00.000')
time_objects = epoch + offset.astype('timedelta64[ms]')
time_strings = np.datetime_as_string(time_objects)
我已经成功地使用了 lambda 和列表理解,但是从 Python 列表到 Numpy 数组来回切换似乎很尴尬。
f = lambda x: x[:10] + ',' + x[11:]
np.array([f(x) for x in time_strings])
我知道在某些情况下可以将 lambda 应用于 "direct" 到 Numpy 数组,但在这种情况下不起作用。 f(time_strings)
产生类型错误。有什么想法吗?
我知道我可以转换回 Python 日期时间(这是我来自的方向)或使用 Pandas。但是 datetime_as_string
函数真的很快,我想坚持使用 Numpy 解决方案。
--- 基于答案的结论---
事实证明,Paul 的视图施放黑魔法比我的列表理解快 75 倍,比 np.char.replace()
快 100 倍。下面是三种方法的结果(都是用上面的数据集初始化的,但是有 1000000 个元素)。
start = time.time()
time_strings[..., None].view('U1')[..., 10] = ','
print(time.time() - start)
0.016000747680664062 seconds
start = time.time()
f = lambda x: x[:10] + ',' + x[11:]
time_strings = np.array([f(x) for x in time_strings])
print(time.time() - start, 'seconds')
1.1740672588348389 seconds
start = time.time()
time_strings = np.char.replace(time_strings,'T',',')
print(time.time() - start, 'seconds')
1.4980854988098145 seconds
您可以使用视播来访问单个角色:
time_strings[...,None].view('U1')[...,10] = ','
就地更改time_strings
。
In [309]: np.char.replace(time_strings,'T',',')
Out[309]:
array(['1970-01-01,00:00:00.000', '1970-01-01,00:00:00.001',
'1970-01-01,00:00:00.002', '1970-01-01,00:00:00.003',
'1970-01-01,00:00:00.004', '1970-01-01,00:00:00.005',
'1970-01-01,00:00:00.006', '1970-01-01,00:00:00.007',
....
但是@PaulPanzer 的就地速度要快得多(甚至有点晦涩难懂):
In [316]: %%timeit temp=time_strings.copy()
...: temp[...,None].view('U1')[...,10] = ','
8.48 µs ± 34.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [317]: timeit np.char.replace(time_strings,'T',',')
1.23 ms ± 1.12 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
我有一个 Datetime64 对象的 Numpy 数组,我需要将其转换为特定的时间格式 yyyy-mm-dd,HH:MM:SS.SSS
Numpy 有一个名为 datetime_as_string
的函数,它输出 ISO8601 (yyyy-mm-ddTHH:MM:SS.SSS) 时间,这非常接近我想要的,唯一的区别是我想要的地方有一个 T一个逗号。
有没有办法快速将 "T" 换成“,”?这是一个示例数据集:
offset = np.arange(0, 1000)
epoch = np.datetime64('1970-01-01T00:00:00.000')
time_objects = epoch + offset.astype('timedelta64[ms]')
time_strings = np.datetime_as_string(time_objects)
我已经成功地使用了 lambda 和列表理解,但是从 Python 列表到 Numpy 数组来回切换似乎很尴尬。
f = lambda x: x[:10] + ',' + x[11:]
np.array([f(x) for x in time_strings])
我知道在某些情况下可以将 lambda 应用于 "direct" 到 Numpy 数组,但在这种情况下不起作用。 f(time_strings)
产生类型错误。有什么想法吗?
我知道我可以转换回 Python 日期时间(这是我来自的方向)或使用 Pandas。但是 datetime_as_string
函数真的很快,我想坚持使用 Numpy 解决方案。
--- 基于答案的结论---
事实证明,Paul 的视图施放黑魔法比我的列表理解快 75 倍,比 np.char.replace()
快 100 倍。下面是三种方法的结果(都是用上面的数据集初始化的,但是有 1000000 个元素)。
start = time.time()
time_strings[..., None].view('U1')[..., 10] = ','
print(time.time() - start)
0.016000747680664062 seconds
start = time.time()
f = lambda x: x[:10] + ',' + x[11:]
time_strings = np.array([f(x) for x in time_strings])
print(time.time() - start, 'seconds')
1.1740672588348389 seconds
start = time.time()
time_strings = np.char.replace(time_strings,'T',',')
print(time.time() - start, 'seconds')
1.4980854988098145 seconds
您可以使用视播来访问单个角色:
time_strings[...,None].view('U1')[...,10] = ','
就地更改time_strings
。
In [309]: np.char.replace(time_strings,'T',',')
Out[309]:
array(['1970-01-01,00:00:00.000', '1970-01-01,00:00:00.001',
'1970-01-01,00:00:00.002', '1970-01-01,00:00:00.003',
'1970-01-01,00:00:00.004', '1970-01-01,00:00:00.005',
'1970-01-01,00:00:00.006', '1970-01-01,00:00:00.007',
....
但是@PaulPanzer 的就地速度要快得多(甚至有点晦涩难懂):
In [316]: %%timeit temp=time_strings.copy()
...: temp[...,None].view('U1')[...,10] = ','
8.48 µs ± 34.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [317]: timeit np.char.replace(time_strings,'T',',')
1.23 ms ± 1.12 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)