我有一个字符串数组
>>> lines
array(['RL5\\Stark_223', 'RL5\\Stark_223', 'RL5\\Stark_223', ...,
'RL5\\Stark_238', 'RL5\\Stark_238', 'RL5\\Stark_238'],
dtype='|S27')
为什么我可以索引第一个数组元素的字符串
>>> lines[0][0:3]
'RL5'
但不是所有数组元素的同一个地方
>>> lines[:][0:3]
array(['RL5\\Stark_223', 'RL5\\Stark_223', 'RL5\\Stark_223'],
dtype='|S27')
任何人都可以建议一种方法来获得以下结果:
数组(['RL5','RL5','RL5',......'RL5','RL5')
答案 0 :(得分:5)
要提取每个字符串的第一个n
字符,您可以滥用.astype
:
>>> s = np.array(['RL5\\Stark_223', 'RL5\\Stark_223', 'RL5\\Stark_223'])
>>> s
array(['RL5\\Stark_223', 'RL5\\Stark_223', 'RL5\\Stark_223'],
dtype='|S13')
>>> s.astype('|S3')
array(['RL5', 'RL5', 'RL5'],
dtype='|S3')
答案 1 :(得分:3)
别忘了chararrays!
lines.view(np.chararray).ljust(3)
chararray(['RL5', 'RL5', 'RL5', 'RL5', 'RL5', 'RL5'],
dtype='|S3')
虽然奇怪的慢了:
#Extend lines to 600000 elements
%timeit lines.view(np.chararray).ljust(3)
1 loops, best of 3: 542 ms per loop
%timeit np.vectorize(lambda x: x[:3])(lines)
1 loops, best of 3: 239 ms per loop
%timeit map(lambda s: s[0:3], lines)
1 loops, best of 3: 243 ms per loop
%timeit arr.astype('|S3')
100 loops, best of 3: 4.72 ms per loop
可能是因为它复制了数据,这样做的好处是输出数组的dtype被最小化:S3
vs S64
。
答案 2 :(得分:1)
试试这个
map(lambda s:s[0:3],lines)
答案 3 :(得分:0)
你可以使用numpy的vectorize:
In [11]: np.vectorize(lambda x: x[:3])(lines)
Out[11]:
array(['RL5', 'RL5', 'RL5', 'RL5', 'RL5', 'RL5'],
dtype='|S64')
答案 4 :(得分:0)
如果您正在寻找快速且(稍微更具)灵活性,请尝试:
lines.view('|S1').reshape(-1, lines.dtype.itemsize)[:, :3].reshape(-1).view('|S3')
可用于更多任意切片和切割。
时间信息:
import numpy as np
lines = np.array(['RL5\\Stark_223', 'RL5\\Stark_223', 'RL5\\Stark_223',
'RL5\\Stark_238', 'RL5\\Stark_238', 'RL5\\Stark_238'], dtype='|S27').repeat(100000)
%timeit lines.view(np.chararray).ljust(3)
1 loop, best of 3: 231 ms per loop
%timeit np.vectorize(lambda x: x[:3])(lines)
1 loop, best of 3: 226 ms per loop
%timeit map(lambda s: s[0:3], lines)
1 loop, best of 3: 171 ms per loop
%timeit lines.astype('|S3')
100 loops, best of 3: 3.58 ms per loop
%timeit lines.view('|S1').reshape(-1, lines.dtype.itemsize)[:, :3].reshape(-1).view('|S3')
100 loops, best of 3: 5.16 ms per loop