在Python中使用numpy高效扁平化数组的正确方法?

38 投票
4 回答
94592 浏览
提问于 2025-04-17 11:54

我有:

a = array([[1,2,3],[4,5,6]])

我想把它变得扁平一些,把里面的两个列表合并成一个平坦的数组项。我可以这样做:

array(list(flatten(a)))

但这样做似乎效率不高,因为我需要把列表转换成数组(我想要的是数组,而不是生成器)。

另外,如何把这个方法推广到像这样的数组:

b = array([[[1,2,3],[4,5,6]], [[10,11,12],[13,14,15]]])

期望的结果应该是:

b = array([[1,2,3,4,5,6],
           [10,11,12,13,14,15]])

有没有内置的、有效的numpy/scipy操作可以做到这一点?谢谢。

4 个回答

12

这样怎么样:

>>> import numpy as np
>>> a=np.arange(1,7).reshape((2,3))
>>> a
array([[1, 2, 3],
       [4, 5, 6]])
>>> a.flatten()
array([1, 2, 3, 4, 5, 6])

还有

>>> import numpy as np
>>> b=np.arange(1,13).reshape((2,2,3))
>>> b
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])
>>> b.reshape((2,6))
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12]])
43

你可能需要了解一下 numpy.flattennumpy.ravel 这两个函数,它们都可以把多维数组变成一维数组。

而且,如果你不打算修改返回的一维数组,我建议你使用 numpy.ravel,因为它不会复制数组,而只是返回数组的一个视图,这样比 numpy.flatten 快得多。

>>>a = np.arange(10000).reshape((100,100))

>>>%timeit a.flatten()
100000 loops, best of 3: 4.02 µs per loop

>>>%timeit a.ravel()
1000000 loops, best of 3: 412 ns per loop

另外,可以看看这个 帖子

22

你可以使用 reshape 方法

>>> import numpy
>>> b = numpy.array([[[1,2,3],[4,5,6]], [[10,11,12],[13,14,15]]])
>>> b.reshape([2, 6])
array([[ 1,  2,  3,  4,  5,  6],
       [10, 11, 12, 13, 14, 15]])

撰写回答