zip()是在numpy中将数组与内存相结合的最有效方法吗?

use*_*453 1 python arrays zip numpy genfromtxt

我使用numpy并有两个数组,可以读取genfromtxt.

它们的形状<10000,>根据np.shape().

我希望这两个向量与形状一起在数组中<10000,2>.现在我使用:

x = zip(x1,x2)
Run Code Online (Sandbox Code Playgroud)

但我不确定是否有numpy功能可以更好/更有效地做到这一点.我不认为连接符合我的想法(或者我做错了).

mgi*_*son 6

numpy.column_stack:

>>> a = numpy.arange(10)
>>> b = numpy.arange(1, 11)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
>>> numpy.column_stack((a, b))
array([[ 0,  1],
       [ 1,  2],
       [ 2,  3],
       [ 3,  4],
       [ 4,  5],
       [ 5,  6],
       [ 6,  7],
       [ 7,  8],
       [ 8,  9],
       [ 9, 10]])
>>> numpy.column_stack((a, b)).shape
(10, 2)
Run Code Online (Sandbox Code Playgroud)

我不作任何保证,这是在任何方面更好zip在内存使用等方面,但骨子里,它似乎依靠numpy.concatenate(这是用C实现的),所以这是至少令人鼓舞的:

>>> import inspect
>>> print inspect.getsource(numpy.column_stack)
def column_stack(tup):
    """
    Stack 1-D arrays as columns into a 2-D array.

    Take a sequence of 1-D arrays and stack them as columns
    to make a single 2-D array. 2-D arrays are stacked as-is,
    just like with `hstack`.  1-D arrays are turned into 2-D columns
    first.

    Parameters
    ----------
    tup : sequence of 1-D or 2-D arrays.
        Arrays to stack. All of them must have the same first dimension.

    Returns
    -------
    stacked : 2-D array
        The array formed by stacking the given arrays.

    See Also
    --------
    hstack, vstack, concatenate

    Notes
    -----
    This function is equivalent to ``np.vstack(tup).T``.

    Examples
    --------
    >>> a = np.array((1,2,3))
    >>> b = np.array((2,3,4))
    >>> np.column_stack((a,b))
    array([[1, 2],
           [2, 3],
           [3, 4]])

    """
    arrays = []
    for v in tup:
        arr = array(v, copy=False, subok=True)
        if arr.ndim < 2:
            arr = array(arr, copy=False, subok=True, ndmin=2).T
        arrays.append(arr)
    return _nx.concatenate(arrays, 1)
Run Code Online (Sandbox Code Playgroud)


小智 6

一个简单的测试:

python -m timeit "import numpy as np; x, y = np.array([range(100000), range(100000,200000)]); zip(x,y)"
Run Code Online (Sandbox Code Playgroud)

10个循环,最佳3:32.2毫秒每个循环

python -m timeit "import numpy as np; x, y = np.array([range(100000), range(100000,200000)]); np.column_stack((x, y))"
Run Code Online (Sandbox Code Playgroud)

10个循环,最佳3:每循环14.4毫秒