Append Row(s) to a NumPy Record Array

前端 未结 3 631
忘了有多久
忘了有多久 2021-02-06 06:33

Is there a way to append a row to a NumPy rec.array()? For example,

x1=np.array([1,2,3,4])
x2=np.array([\'a\',\'dd\',\'xyz\',\'12\'])
x3=np.array([1.1,2,3,4])
r         


        
3条回答
  •  粉色の甜心
    2021-02-06 06:44

    Extending @unutbu's answer I post a more general function that appends any number of rows:

    def append_rows(arrayIN, NewRows):
        """Append rows to numpy recarray.
    
        Arguments:
          arrayIN: a numpy recarray that should be expanded
          NewRows: list of tuples with the same shape as `arrayIN`
    
        Idea: Resize recarray in-place if possible.
        (only for small arrays reasonable)
    
        >>> arrayIN = np.array([(1, 'a', 1.1), (2, 'dd', 2.0), (3, 'x', 3.0)],
                               dtype=[('a', '>> NewRows = [(4, '12', 4.0), (5, 'cc', 43.0)]
        >>> append_rows(arrayIN, NewRows)
        >>> print(arrayIN)
        [(1, 'a', 1.1) (2, 'dd', 2.0) (3, 'x', 3.0) (4, '12', 4.0) (5, 'cc', 43.0)]
    
        Source: http://stackoverflow.com/a/1731228/2062965
        """
        # Calculate the number of old and new rows
        len_arrayIN = arrayIN.shape[0]
        len_NewRows = len(NewRows)
        # Resize the old recarray
        arrayIN.resize(len_arrayIN + len_NewRows, refcheck=False)
        # Write to the end of recarray
        arrayIN[-len_NewRows:] = NewRows
    

    Comment

    I want to stress that pre-allocation of an array, which is at least big enough, is the most reasonable solution (if you have an idea about the final size of the array)! Pre-allocation also saves you a lot of time.

提交回复
热议问题