如何按值拆分字符串类型数组

时间:2018-01-22 08:31:19

标签: python arrays numpy

说我有一个str数组:

['12.5', '7', '45', '\n', '13.7', '52', '34.3', '\n']

我希望按值将其拆分,在本例中为'\n',因此它变为:

[['12.5',  '7', '45'],
 ['13.7', '52', '34.3']]

我不想枚举每个元素,因为当输入具有大规模时耗时。所以我想知道是否有一些功能或python技巧可以很容易地实现这一点。

P.S。

我看过this question,但没有多大帮助。主要是因为我不太了解np.where()如何与np.split()一起使用,也因为我正在处理str类型。

另一件事可能有用的是我的最终目标是生成一个数字矩阵(可能是float类型),所以我也很高兴知道是否有任何numpy函数可以做到这一点。

3 个答案:

答案 0 :(得分:2)

你可以使用itertools.groupby,当然,它会迭代列表,但是经过高度优化:

from itertools import groupby

l = ['12.5', '7', '45', '\n', '13.7', '52', '34.3', '\n']

[list(g) for k, g in groupby(lst, '\n'.__eq__) if not k]
# [['12.5', '7', '45'], ['13.7', '52', '34.3']]

或者,使用浮动转换:

[list(map(float, g)) for k, g in groupby(lst, '\n'.__eq__) if not k]
# [[12.5, 7.0, 45.0], [13.7, 52.0, 34.3]]

答案 1 :(得分:1)

使用numpy

rows = np.split(z, np.where(arr == '\n')[0] + 1)[:-1]
mat = np.array(rows).astype(np.float)

或者,如果我们确定要处理矩阵,您只需搜索第一次出现的'\n',重新整形并使用它进行切片。

first = np.argmax(arr == '\n')
mat = arr.reshape(-1, first + 1)[:, 0:first].astype(np.float)

可能更快。

答案 2 :(得分:0)

我曾经为此做过一件事。一个chunking模块。它的工作方式类似于str.split

pip install chunking

然后

>>> from chunking import split
>>> a_list = ["foo", 'bar', 'SEP', 'bacon', 'eggs']
>>> split(a_list, 'SEP')
[['foo', 'bar'], ['bacon', 'eggs']]

还有chunking.iter_split,这是它的生成变体。