在Python的NumPy中,将数组展平的正确高效方法是什么?

38

我有:

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个回答

43

你可能需要查看numpy.flattennumpy.ravel,它们都可以从n维数组返回一个一维数组。

此外,如果你不打算修改返回的一维数组,我建议你使用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

还要看看这个文章


7
我必须查一下:micro = 10^-6,nano = 10^-9。 - Tom Hale
一个视图并不总是更好的选择,如果你在使用时没有小心谨慎地记住它只是一个视图,就可能会出现错误 - 只有在确实需要时才使用。 - Fermi-4

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]])

我认为应该是 a.reshape([2,6]),谢谢! - user248237
@user248237:啊,抱歉,我误读了你的问题,但仍然需要使用那个方法。现在已经修复了。 :) - Matteo Italia
5
reshape()是一个不错的方法。 - Honghe.Wu
7
如果你像我一样懒,可以使用b.reshape([2, -1]) - usual me

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]])

+1 对于flatten()——它也可以进行Fortran/列优先展平。reshape(-1)同样可以实现展平。 - Dave X

-1
a = np.arange(10000)

%timeit a.reshape(100,100)
1000000 loops, best of 3: 517 ns per loop

%timeit a.resize(100,100)
1000000 loops, best of 3: 428 ns per loop

我想重塑应该花费更少的时间,但它几乎相似


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接