Concatenating empty array in Numpy

后端 未结 6 477
情歌与酒
情歌与酒 2021-01-30 16:04

in Matlab I do this:

>> E = [];
>> A = [1 2 3 4 5; 10 20 30 40 50];
>> E = [E ; A]

E =

     1     2     3     4     5
    10    20    30    4         


        
相关标签:
6条回答
  • 2021-01-30 16:39

    if you know the number of columns before hand:

    >>> xs = np.array([[1,2,3,4,5],[10,20,30,40,50]])
    >>> ys = np.array([], dtype=np.int64).reshape(0,5)
    >>> ys
    array([], shape=(0, 5), dtype=int64)
    >>> np.vstack([ys, xs])
    array([[  1.,   2.,   3.,   4.,   5.],
           [ 10.,  20.,  30.,  40.,  50.]])
    

    if not:

    >>> ys = np.array([])
    >>> ys = np.vstack([ys, xs]) if ys.size else xs
    array([[ 1,  2,  3,  4,  5],
           [10, 20, 30, 40, 50]])
    
    0 讨论(0)
  • 2021-01-30 16:39

    np.concatenate, np.hstack and np.vstack will do what you want. Note however that NumPy arrays are not suitable for use as dynamic arrays. Use Python lists for that purpose instead.

    0 讨论(0)
  • 2021-01-30 16:47
    E = np.array([
        
    ]).reshape(0, 5)
    print("E: \n{}\nShape {}\n".format(E, E.shape))
    
    A = np.vstack([
        [1, 2, 3, 4, 5], 
        [10, 20, 30, 40, 50]]
    )
    print("A:\n{}\nShape {}\n".format(A, A.shape))
    
    C = np.r_[
        E, 
        A
    ].astype(np.int32)
    
    print("C:\n{}\nShape {}\n".format(C, C.shape))
    
    E: 
    []
    Shape (0, 5)
    
    A:
    [[ 1  2  3  4  5]
     [10 20 30 40 50]]
    Shape (2, 5)
    
    C:
    [[ 1  2  3  4  5]
     [10 20 30 40 50]]
    Shape (2, 5)
    
    0 讨论(0)
  • 2021-01-30 16:50

    In Python, if possible to work with the individual vectors, to append you should use list.append()

    >>> E = []
    >>> B = np.array([1,2,3,4,5])
    >>> C = np.array([10,20,30,40,50])
    >>> E = E.append(B)
    >>> E = E.append(C)
    [array([1, 2, 3, 4, 5]), array([10, 20, 30, 40, 50])]
    

    and then after all append operations are done, return to np.array thusly

    >>> E = np.array(E)
    array([[ 1,  2,  3,  4,  5],
       [10, 20, 30, 40, 50]])
    
    0 讨论(0)
  • 2021-01-30 16:54

    If you wanna do this just because you cannot concatenate an array with an initialized empty array in a loop, then just use a conditional statement, e.g.

    if (i == 0): 
       do the first assignment
    else:  
       start your contactenate 
    
    0 讨论(0)
  • 2021-01-30 16:58

    Something that I've build to deal with this sort of problem. It's also deals with list input instead of np.array:

    import numpy as np
    
    
    def cat(tupleOfArrays, axis=0):
        # deals with problems of concating empty arrays
        # also gives better error massages
    
        # first check that the input is correct
        assert isinstance(tupleOfArrays, tuple), 'first var should be tuple of arrays'
    
        firstFlag = True
        res = np.array([])
    
        # run over each element in tuple
        for i in range(len(tupleOfArrays)):
            x = tupleOfArrays[i]
            if len(x) > 0:  # if an empty array\list - skip
                if isinstance(x, list):  # all should be ndarray
                    x = np.array(x)
                if x.ndim == 1:  # easier to concat 2d arrays
                    x = x.reshape((1, -1))
                if firstFlag:  # for the first non empty array, just swich the empty res array with it
                    res = x
                    firstFlag = False
                else:  # actual concatination
    
                    # first check that concat dims are good
                    if axis == 0:
                        assert res.shape[1] == x.shape[1], "Error concating vertically element index " + str(i) + \
                                                           " with prior elements: given mat shapes are " + \
                                                           str(res.shape) + " & " + str(x.shape)
                    else:  # axis == 1:
                        assert res.shape[0] == x.shape[0], "Error concating horizontally element index " + str(i) + \
                                                           " with prior elements: given mat shapes are " + \
                                                           str(res.shape) + " & " + str(x.shape)
    
                    res = np.concatenate((res, x), axis=axis)
        return res
    
    
    if __name__ == "__main__":
        print(cat((np.array([]), [])))
        print(cat((np.array([1, 2, 3]), np.array([]), [1, 3, 54+1j]), axis=0))
        print(cat((np.array([[1, 2, 3]]).T, np.array([]), np.array([[1, 3, 54+1j]]).T), axis=1))
        print(cat((np.array([[1, 2, 3]]).T, np.array([]), np.array([[3, 54]]).T), axis=1))  # a bad one
    
    0 讨论(0)
提交回复
热议问题