这是对 flatten 的正确使用吗?

Posted

技术标签:

【中文标题】这是对 flatten 的正确使用吗?【英文标题】:Is this correct use of flatten? 【发布时间】:2018-08-13 15:15:07 【问题描述】:

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

wd = ['this' , 'is']

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

返回:

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

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

flatten 的用法正确吗?

【问题讨论】:

你为什么使用 numpy? list(''.join(wd)) 怎么样? 您可能对np.array(wd).view('<U1')感兴趣 @WarrenWeckesser 是的,这也有效,谢谢。但是 flatten 应该完成相同的操作吗? 在你的代码中 flatten 什么都不做。 [['t', 'h', 'i', 's'], ['i', 's']] 是您传递给 np.asarray 的内容,即 array([list(['t', 'h', 'i', 's']), list(['i', 's'])], dtype=object) -- 调用 flatten 对该数组没有任何作用。 @blue-sky flatten 不是解决此问题的正确工具。 【参考方案1】:

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

二维 NumPy 数组必须是矩形的,否则它们将被强制转换为对象数组(否则会抛出异常)。使用对象数组 flatten 将无法正常工作(因为它不会使“对象”变平)并且矩形是不可能的,因为您的单词有不同的长度。

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

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

幸运的是,您可以简单地使用“普通”Python 功能来扁平化可迭代对象,仅举一个例子:

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

您可能想查看以下 Q+A 以获得更多解决方案和解释:

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

【讨论】:

【参考方案2】:

只有一个列表迭代:

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

给你这个:

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

尽管正如 cmets 所说,您可以将 ''.join() 用于您的具体示例,但这具有适用于 numpy 数组和列表列表的优势:

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

[u for i in test for u in i]

返回一个平面列表:

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

【讨论】:

【参考方案3】:
In[8]: from itertools import chain
In[9]: list(chain.from_iterable(['this' , 'is']))
Out[9]: ['t', 'h', 'i', 's', 'i', 's']

【讨论】:

以上是关于这是对 flatten 的正确使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] Flatten Binary Tree to Linked List

这是对成员访问规则的正确总结吗?

这是对 Range-Hash 分区的正确解释吗?

这是对在 Java 中创建新对象的过程的正确描述吗?

ceph已有image怎么更改feature

使用 Theano 后端的 Keras Flatten() 层行为不一致