这是扁平化的正确用法吗?

Is this correct use of flatten?

我正在尝试使用以下方法展平列表:

wd = ['this' , 'is']

np.asarray(list(map(lambda x : list(x) , wd))).flatten()

哪个returns:

array([['t', 'h', 'i', 's'], ['i', 's']], dtype=object)

当我期待一个字符数组时:['t','h','i','s','i','s']

flatten 的用法是否正确?

In[8]: from itertools import chain
In[9]: list(chain.from_iterable(['this' , 'is']))
Out[9]: ['t', 'h', 'i', 's', 'i', 's']

只有一个列表迭代:

[u for i in np.asarray(list(map(lambda x : list(x) , wd))) for u in i]

给你这个:

['t', 'h', 'i', 's', 'i', 's']

虽然,正如评论所说,您可以只使用 ''.join() 作为您的特定示例,但这具有适用于 numpy 数组和列表列表的优点:

test = np.array(range(10)).reshape(2,-1)

[u for i in test for u in i]

returns 平面列表:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

不,这不是 numpy.ndarray.flatten 的正确用法。

Two-dimensional NumPy 数组必须是矩形的,否则它们将被转换为对象数组(否则会抛出异常)。使用对象数组展平将无法正常工作(因为它不会展平 "objects")并且矩形是不可能的,因为你的单词有不同的长度。

在处理字符串(或字符串数​​组)时,NumPy 根本不会将它们展平,无论是在您创建数组时,还是在您尝试 "flatten" 它时:

>>> import numpy as np
>>> np.array(['fla', 'tten'])
array(['fla', 'tten'], dtype='<U4')
>>> np.array(['fla', 'tten']).flatten()
array(['fla', 'tten'], dtype='<U4')

幸运的是,您可以简单地使用 "normal" Python 特性来扁平化可迭代对象,仅举一个例子:

>>> wd = ['this' , 'is']
>>> [element for sequence in wd for element in sequence]
['t', 'h', 'i', 's', 'i', 's']

你可能想看看下面的问答以获得更多的解决方案和解释:

  • Making a flat list out of list of lists in Python
  • Flatten (an irregular) list of lists