Python 字符串的numpy数组索引行为

Python 字符串的numpy数组索引行为,python,arrays,string,numpy,indexing,Python,Arrays,String,Numpy,Indexing,我有一个字符串数组 >>> 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
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')

试试这个

map(lambda s:s[0:3],lines)
您可以使用numpy的:


别忘了Chararray

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

可能是因为它复制了数据,这样做的好处是输出数组的数据类型被最小化:
S3
vs
S64
提取每个可以滥用的字符串的第一个
n
字符

>>> 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')

如果您正在寻找快速且(稍微更)灵活的解决方案,请尝试:

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

不知道为什么这个答案这么难找到!简单而中肯——谢谢!
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