您的字符串数组将数据存储为连续的字符块,使用 'S3' dtype 将其划分为长度为 3 的字符串。
In [116]: my_list
Out[116]:
array(['abc', 'def', 'ghi'],
dtype='|S3')
S1,S2 dtype 将每个元素视为 2 个字符串,每个字符串有 1 个和 2 个字符:
In [115]: my_list.view('S1,S2')
Out[115]:
array([('a', 'bc'), ('d', 'ef'), ('g', 'hi')],
dtype=[('f0', 'S1'), ('f1', 'S2')])
选择第二个字段以获取包含所需字符的数组:
In [114]: my_list.view('S1,S2')[1:]['f1']
Out[114]:
array(['ef', 'hi'],
dtype='|S2')
我对@987654325@ 的第一次尝试是将数组拆分为单字节字符串,并使用生成的二维数组:
In [48]: my_2dstrings = my_list.view(dtype='|S1').reshape(3,-1)
In [49]: my_2dstrings
Out[49]:
array([['a', 'b', 'c'],
['d', 'e', 'f'],
['g', 'h', 'i']],
dtype='|S1')
然后可以在两个维度上对这个数组进行切片。我使用flatten 删除了维度,并强制进行了复制(以获取新的连续缓冲区)。
In [50]: my_2dstrings[1:,1:].flatten().view(dtype='|S2')
Out[50]:
array(['ef', 'hi'],
dtype='|S2')
如果字符串已经在数组中(而不是列表),那么这种方法比列表理解方法快得多。
wflynny 测试的 1000 x 64 列表的一些计时
In [98]: timeit [s[1:] for s in my_list_64[1:]]
10000 loops, best of 3: 173 us per loop # mine's slower computer
In [99]: timeit np.array(my_list_64).view('S1').reshape(64,-1)[1:,1:].flatten().view('S63')
1000 loops, best of 3: 213 us per loop
In [100]: %%timeit arr =np.array(my_list_64)
.....: arr.view('S1').reshape(64,-1)[1:,1:].flatten().view('S63') .....:
10000 loops, best of 3: 23.2 us per loop
从列表中创建数组很慢,但一旦创建,view 方法会快得多。
查看我之前在np.char 上的注释的编辑历史记录。