当前位置: 首页 > 面试题库 >

如何在不使用numpy的情况下将2D列表展平为1D?

杜楚
2023-03-14
问题内容

我有一个列表看起来像这样:

[[1,2,3],[1,2],[1,4,5,6,7]]

我想把它弄平 [1,2,3,1,2,1,4,5,6,7]

有没有使用numpy的轻量级功能来执行此操作?


问题答案:

如果没有numpy(ndarray.flatten),一种使用方式
chain.from_iterableitertools.chain

>>> list(chain.from_iterable([[1,2,3],[1,2],[1,4,5,6,7]]))
[1, 2, 3, 1, 2, 1, 4, 5, 6, 7]

或者作为另一种Python方式,您可以使用 列表理解

[j for sub in [[1,2,3],[1,2],[1,4,5,6,7]] for j in sub]

另一个非常适合短列表的功能方法也可以reduce在Python2和functools.reducePython3中使用(不要将其用于长列表):

In [4]: from functools import reduce # Python3

In [5]: reduce(lambda x,y :x+y ,[[1,2,3],[1,2],[1,4,5,6,7]])
Out[5]: [1, 2, 3, 1, 2, 1, 4, 5, 6, 7]

为了使其更快一点,您可以使用operator.add内置,而不是lambda

In [6]: from operator import add

In [7]: reduce(add ,[[1,2,3],[1,2],[1,4,5,6,7]])
Out[7]: [1, 2, 3, 1, 2, 1, 4, 5, 6, 7]

In [8]: %timeit reduce(lambda x,y :x+y ,[[1,2,3],[1,2],[1,4,5,6,7]])
789 ns ± 7.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [9]: %timeit reduce(add ,[[1,2,3],[1,2],[1,4,5,6,7]])
635 ns ± 4.38 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

基准:

:~$ python -m timeit "from itertools import chain;chain.from_iterable([[1,2,3],[1,2],[1,4,5,6,7]])"
1000000 loops, best of 3: 1.58 usec per loop
:~$ python -m timeit "reduce(lambda x,y :x+y ,[[1,2,3],[1,2],[1,4,5,6,7]])"
1000000 loops, best of 3: 0.791 usec per loop
:~$ python -m timeit "[j for i in [[1,2,3],[1,2],[1,4,5,6,7]] for j in i]"
1000000 loops, best of 3: 0.784 usec per loop

使用@Will答案的基准测试sum(对于短列表而言,它的速度很快,但对于长列表而言,它的速度很快):

:~$ python -m timeit "sum([[1,2,3],[4,5,6],[7,8,9]], [])"
1000000 loops, best of 3: 0.575 usec per loop
:~$ python -m timeit "sum([range(100),range(100)], [])"
100000 loops, best of 3: 2.27 usec per loop
:~$ python -m timeit "reduce(lambda x,y :x+y ,[range(100),range(100)])"
100000 loops, best of 3: 2.1 usec per loop


 类似资料:
  • rbindlist做的正是我需要的,但'do.call'做不到! do.Call不是我想要的

  • 本文向大家介绍在Python中将2d numpy数组展平为1d数组,包括了在Python中将2d numpy数组展平为1d数组的使用技巧和注意事项,需要的朋友参考一下 2d numpy数组是数组的数组。在本文中,我们将看到如何展平它以使元素成为一维数组。 与扁平化 numpy中的flatten函数是将2d数组转换为1D数组的直接方法。 示例 输出结果 运行上面的代码给我们以下结果- 带旅行 还有一

  • 我的老师想让我通过迭代找到用户10个输入的中位数。 这就是我使用迭代来查找总和,奇数数,最大值和质数数的方式。但我一直坚持要找到中位数。

  • 问题内容: 这是我目前拥有的: 它创建一个CSV文件,其输出如下所示: 我不希望行放在括号中,也不希望在字符串前加引号或’u’。如何在没有所有这些的情况下将行写入csv?谢谢, 问题答案: 您目前正在做的是打印出元组的python字符串表示形式,即返回值。其中包括引号,“ u”和括号等。 相反,您希望数据正确格式化为CSV文件。好吧,尝试模块。毫无疑问,它知道如何格式化CSV文件的格式。

  • 问题内容: 我使用一个外部模块(libsvm),该模块不支持numpy数组,仅支持元组,列表和字典。但是我的数据是二维二维数组。我如何以pythonic方式转换它,也就是没有循环。 问题答案: 您可以简单地将矩阵转换为,以证明:

  • 问题内容: 给定以下元组列表: 我如何将其拼凑成列表? 有没有一线做上面的事情? 问题答案: 您可以使用列表推导: 在以下情况下也经常使用: 但是,这并不是完全一样的。