
    ,Vh                        d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z dd	l	mZ dd
lmZ g dZej"                  ZdddddddddddddddZej&                  Z ed      d        Z ed       G d d             Z G d dej.                        Z ed       G d de             Zd Z ed      	 	 d!d       Z ed      	 	 d!d       Z ed      	 	 d"d       Zd Z ed      	 	 d"d       Z ed      	 	 d#d        Z y)$z<
This module contains a set of functions for record arrays.
    N)Counter)nullcontext   )
set_module   )numeric)numerictypes)_get_legacy_print_mode)	recordrecarrayformat_parser
fromarraysfromrecords
fromstringfromfilearrayfind_duplicate><=s|)blnBLNSr   r   r   r   r   Iiz	numpy.recc                 p    t        |       j                         D cg c]  \  }}|dkD  r| c}}S c c}}w )z@Find duplication in a list, return a list of duplicated elementsr   )r   items)listitemcountss      C/home/dcms/DCMS/lib/python3.12/site-packages/numpy/_core/records.pyr   r   .   s<    
 $DM//1D&A: 	  s   2c                   ,    e Zd ZdZddZddZd Zd Zy)	r   a  
    Class to convert formats, names, titles description to a dtype.

    After constructing the format_parser object, the dtype attribute is
    the converted data-type:
    ``dtype = format_parser(formats, names, titles).dtype``

    Attributes
    ----------
    dtype : dtype
        The converted data-type.

    Parameters
    ----------
    formats : str or list of str
        The format description, either specified as a string with
        comma-separated format descriptions in the form ``'f8, i4, S5'``, or
        a list of format description strings  in the form
        ``['f8', 'i4', 'S5']``.
    names : str or list/tuple of str
        The field names, either specified as a comma-separated string in the
        form ``'col1, col2, col3'``, or as a list or tuple of strings in the
        form ``['col1', 'col2', 'col3']``.
        An empty list can be used, in that case default field names
        ('f0', 'f1', ...) are used.
    titles : sequence
        Sequence of title strings. An empty list can be used to leave titles
        out.
    aligned : bool, optional
        If True, align the fields by padding as the C-compiler would.
        Default is False.
    byteorder : str, optional
        If specified, all the fields will be changed to the
        provided byte-order.  Otherwise, the default byte-order is
        used. For all available string specifiers, see `dtype.newbyteorder`.

    See Also
    --------
    numpy.dtype, numpy.typename

    Examples
    --------
    >>> import numpy as np
    >>> np.rec.format_parser(['<f8', '<i4'], ['col1', 'col2'],
    ...                      ['T1', 'T2']).dtype
    dtype([(('T1', 'col1'), '<f8'), (('T2', 'col2'), '<i4')])

    `names` and/or `titles` can be empty lists. If `titles` is an empty list,
    titles will simply not appear. If `names` is empty, default field names
    will be used.

    >>> np.rec.format_parser(['f8', 'i4', 'a5'], ['col1', 'col2', 'col3'],
    ...                      []).dtype
    dtype([('col1', '<f8'), ('col2', '<i4'), ('col3', '<S5')])
    >>> np.rec.format_parser(['<f8', '<i4', '<a5'], [], []).dtype
    dtype([('f0', '<f8'), ('f1', '<i4'), ('f2', 'S5')])

    Nc                 n    | j                  ||       | j                  ||       | j                  |       y N)_parseFormats_setfieldnames_createdtype)selfformatsnamestitlesaligned	byteorders         r'   __init__zformat_parser.__init__u   s0    7G,E6*)$    c           	         |t        d      t        |t              rDt        j                  t        |      D cg c]  \  }}dj                  |      |f c}}|      }nt        j                  ||      }|j                  }|%t        j                  d|fg|      }|j                  }|j                  }|D cg c]
  }||   d    c}| _	        |D cg c]
  }||   d    c}| _
        t        |      | _        yc c}}w c c}w c c}w )z Parse the field formats NzNeed formats argumentzf{}f1r   r   )
ValueError
isinstancer$   sbdtype	enumerateformatfieldsr0   
_f_formats_offsetslen_nfields)	r.   r/   r2   r!   format_r;   r>   keyskeys	            r'   r+   zformat_parser._parseFormatsz   s     ?455gt$HH '0&8"7 \\!_g. E HHWg.E>HHtUm_g6E\\F{{59:c6#;q>:378CQ8D	 ;8s   C>
;DD	c                 $   |rt        |      t        t        fv rn9t        |t              r|j                  d      }nt        dt        |      z        |d| j                   D cg c]  }|j                          c}| _
        ng | _
        | xj                  t        t        | j                        | j                        D cg c]  }d|z  	 c}z  c_
        t        | j                        }|rt        d|z        |r1|d| j                   D cg c]  }|j                          c}| _        n	g | _        g }| j                  t        |      kD  r0| xj                  dg| j                  t        |      z
  z  z  c_        yyc c}w c c}w c c}w )zQconvert input field names into a list and assign to the _names
        attribute ,zillegal input names %sNzf%dzDuplicate field names: %s)typer$   tupler9   strsplit	NameErrorreprrB   strip_namesrangerA   r   r8   _titles)r.   r0   r1   r   r!   _dups         r'   r,   zformat_parser._setfieldnames   sP    E{tUm+E3'C( 84; FGG.3NT]].CD1779DDKDK 	5T[[1A15,@ Aa	 A 	A dkk*84?@@/5nt}}/EF!AGGIFDLDLF==3v;&LLTFdmmc&k&ABBL '+ EA Gs   %FFFc                     t        j                  | j                  | j                  | j                  | j
                  d      }|t        |d      }|j                  |      }|| _        y )N)r0   r/   offsetsr1   r   )r:   r;   rO   r?   r@   rQ   _byteorderconvnewbyteorder)r.   r3   r;   s      r'   r-   zformat_parser._createdtype   s^    [[}}ll	
   &y|4I&&y1E
r5   )FN)F)__name__
__module____qualname____doc__r4   r+   r,   r-    r5   r'   r   r   8   s    9v%
"0"CHr5   r   c                   L     e Zd ZdZd Z dZ fdZ fdZd Zd Zd Zd Z	 xZ
S )	r   zEA data-type scalar that allows field access as attribute lookup.
    numpyc                 Z    t               dk  r| j                         S t        |          S Nq   )r
   __str__super__repr__r.   	__class__s    r'   rc   zrecord.__repr__   s(    !#s*<<>!w!!r5   c                 l    t               dk  rt        | j                               S t        |          S r_   )r
   rJ   r%   rb   ra   rd   s    r'   ra   zrecord.__str__   s,    !#s*tyy{##w  r5   c                    |dv r t         j                  j                  | |      S 	 t         j                  j                  | |      S # t        $ r Y nw xY wt         j                  j                  | d      j                  }|j                  |d       }|rf | j                  |d d  }	 |j                  }n# t        $ r |cY S w xY w|j                  '|j                  | j                  |j                  f      S |S t        d|z        )Nsetfieldgetfieldr;   r;   r   %'record' object has no attribute '%s')ntvoid__getattribute__AttributeErrorr>   getrj   r;   r0   viewre   )r.   attr	fielddictresobjdts         r'   rn   zrecord.__getattribute__   s    4477++D$77	77++D$77 		GG,,T7;BB	mmD$'$--Ra)CYY! 
 xx#xx ;<<J  "%'+", - -s#   A 	AA&B3 3C Cc                 F   |dv rt        d|z        t        j                  j                  | d      j                  }|j                  |d       }|r | j                  |g|d d  S t        | |d       r!t        j                  j                  | ||      S t        d|z        )Nrh   zCannot set '%s' attributer;   r   rk   )	ro   rl   rm   rn   r>   rp   ri   getattr__setattr__)r.   rr   valrs   rt   s        r'   ry   zrecord.__setattr__   s    44 !<t!CDDGG,,T7;BB	mmD$' 4==/s2Aw//tT4(ww**4s;;$ &)+/&0 1 1r5   c                     t         j                  j                  | |      }t        |t         j                        r=|j                  j
                  '|j                  | j                  |j                  f      S |S r*   )rl   rm   __getitem__r9   r;   r0   rq   re   )r.   indxru   s      r'   r|   zrecord.__getitem__   sX    gg!!$- c277#		(C88T^^SYY788 Jr5   c           	          | j                   j                  }t        d |D              }d|z  }|D cg c]  }||t        | |      fz   }}dj	                  |      S c c}w )zPretty-print all fields.c              3   2   K   | ]  }t        |        y wr*   )rA   ).0names     r'   	<genexpr>z record.pprint.<locals>.<genexpr>  s     14SY1s   z%% %ds: %%s
)r;   r0   maxrx   join)r.   r0   maxlenfmtr   rowss         r'   pprintzrecord.pprint  se     

  1511f$>CDdtWT4011DDyy Es   A)rW   rX   rY   rZ   rc   ra   rn   ry   r|   r   __classcell__re   s   @r'   r   r      s2    
 HJ"
!
-21r5   r   c                   P     e Zd ZdZ	 	 	 d	dZd Zd Zd Z fdZd Z	d
dZ
 xZS )r   aS  Construct an ndarray that allows field access using attributes.

    Arrays may have a data-types containing fields, analogous
    to columns in a spread sheet.  An example is ``[(x, int), (y, float)]``,
    where each entry in the array is a pair of ``(int, float)``.  Normally,
    these attributes are accessed using dictionary lookups such as ``arr['x']``
    and ``arr['y']``.  Record arrays allow the fields to be accessed as members
    of the array, using ``arr.x`` and ``arr.y``.

    Parameters
    ----------
    shape : tuple
        Shape of output array.
    dtype : data-type, optional
        The desired data-type.  By default, the data-type is determined
        from `formats`, `names`, `titles`, `aligned` and `byteorder`.
    formats : list of data-types, optional
        A list containing the data-types for the different columns, e.g.
        ``['i4', 'f8', 'i4']``.  `formats` does *not* support the new
        convention of using types directly, i.e. ``(int, float, int)``.
        Note that `formats` must be a list, not a tuple.
        Given that `formats` is somewhat limited, we recommend specifying
        `dtype` instead.
    names : tuple of str, optional
        The name of each column, e.g. ``('x', 'y', 'z')``.
    buf : buffer, optional
        By default, a new array is created of the given shape and data-type.
        If `buf` is specified and is an object exposing the buffer interface,
        the array will use the memory from the existing buffer.  In this case,
        the `offset` and `strides` keywords are available.

    Other Parameters
    ----------------
    titles : tuple of str, optional
        Aliases for column names.  For example, if `names` were
        ``('x', 'y', 'z')`` and `titles` is
        ``('x_coordinate', 'y_coordinate', 'z_coordinate')``, then
        ``arr['x']`` is equivalent to both ``arr.x`` and ``arr.x_coordinate``.
    byteorder : {'<', '>', '='}, optional
        Byte-order for all fields.
    aligned : bool, optional
        Align the fields in memory as the C-compiler would.
    strides : tuple of ints, optional
        Buffer (`buf`) is interpreted according to these strides (strides
        define how many bytes each array element, row, column, etc.
        occupy in memory).
    offset : int, optional
        Start reading buffer (`buf`) from this offset onwards.
    order : {'C', 'F'}, optional
        Row-major (C-style) or column-major (Fortran-style) order.

    Returns
    -------
    rec : recarray
        Empty array of the given shape and type.

    See Also
    --------
    numpy.rec.fromrecords : Construct a record array from data.
    numpy.record : fundamental data-type for `recarray`.
    numpy.rec.format_parser : determine data-type from formats, names, titles.

    Notes
    -----
    This constructor can be compared to ``empty``: it creates a new record
    array but does not fill it with data.  To create a record array from data,
    use one of the following methods:

    1. Create a standard ndarray and convert it to a record array,
       using ``arr.view(np.recarray)``
    2. Use the `buf` keyword.
    3. Use `np.rec.fromrecords`.

    Examples
    --------
    Create an array with two fields, ``x`` and ``y``:

    >>> import numpy as np
    >>> x = np.array([(1.0, 2), (3.0, 4)], dtype=[('x', '<f8'), ('y', '<i8')])
    >>> x
    array([(1., 2), (3., 4)], dtype=[('x', '<f8'), ('y', '<i8')])

    >>> x['x']
    array([1., 3.])

    View the array as a record array:

    >>> x = x.view(np.recarray)

    >>> x.x
    array([1., 3.])

    >>> x.y
    array([2, 4])

    Create a new, empty record array:

    >>> np.recarray((2,),
    ... dtype=[('x', int), ('y', float), ('z', int)]) #doctest: +SKIP
    rec.array([(-1073741821, 1.2249118382103472e-301, 24547520),
           (3471280, 1.2134086255804012e-316, 0)],
          dtype=[('x', '<i4'), ('y', '<f8'), ('z', '<i4')])

    c           	          |t        j                  |      }nt        ||||
|	      j                  }|!t        j	                  | |t
        |f|      }|S t        j	                  | |t
        |f||||      }|S )N)order)bufferoffsetstridesr   )r:   r;   r   ndarray__new__r   )subtypeshaper;   bufr   r   r/   r0   r1   r3   r2   r   descrr.   s                 r'   r   zrecarray.__new__  s     HHUOE!e  ;??u # D 	 ??we # D r5   c                     | j                   j                  t        ur)| j                   j                  | j                   | _         y y y r*   )r;   rH   r   r0   )r.   ru   s     r'   __array_finalize__zrecarray.__array_finalize__  s7    ::??&(TZZ-=-=-I DJ .J(r5   c                 &   	 t         j                  | |      S # t        $ r Y nw xY wt        j                  | d      j                  }	 ||   d d }n&# t
        t        f$ r}t        d|z        |d }~ww xY w | j                  | }|j                  j                  bt        |j                  j                  t        j                        r2|j                  | j                  j                  |j                  f      S |S |j                  t              S )Nr;   r   zrecarray has no attribute %sr;   )objectrn   ro   r   r>   	TypeErrorKeyErrorrj   r;   r0   
issubclassrH   rl   rm   rq   )r.   rr   rs   rt   eru   s         r'   rn   zrecarray.__getattribute__  s    	**466 		 ,,T7;BB		OD/"1%C8$ 	O !?$!FGQN	OdmmS! 99??&#)).."''2xxtzz		&BxCCJ88G$$s$    	$$A A4 A//A4c                    |dk(  rKt        |j                  t        j                        r'|j                  t        j                  t        |f      }|| j                  v}	 t        j                  | ||      }t        j                  | d      j                  xs i }||vr|S |r	 t        j                  | |       	 ||   d d } | j&                  |g| S # t        $ r |cY S w xY w# t        $ r, t        j                  | d      j                  xs i }||vr Y aw xY w# t         t"        f$ r}t%        d|z        |d }~ww xY w)Nr;   r   z record array has no attribute %s)r   rH   rl   rm   r0   r:   r;   r   __dict__r   ry   r   rn   r>   __delattr__	Exceptionr   r   ro   ri   )r.   rr   rz   newattrretrs   rt   r   s           r'   ry   zrecarray.__setattr__  sR   
 GOsxx)II!((FC=)Cdmm+	$$T45C  00w?FFL"I9$
&&tT2	D/"1%C
 t}}S'3'' ! J  	00w?FFL"I9$ %	" 8$ 	 2T9	s<    C' $C ;D C$#C$'2DDE.D==Ec                    t         |   |      }t        |t              r|j                  j
                  ||j                  t        |             }t        |j                  j                  t        j                        r2|j                  | j                  j                  |j                  f      S |S |j                  t              S |S )Nr   )rH   )rb   r|   r9   r   r;   r0   rq   rH   r   rl   rm   )r.   r}   ru   re   s      r'   r|   zrecarray.__getitem__  s    g!$' c7#yy*hhtDz*ciinnbgg6884::??CII*F8GG
xxWx-- Jr5   c                 $   | j                   }| j                   j                  t        u s.t        | j                   j                  t        j
                        s<|j                  t        u r%t        j                   t        j
                  |f      }d}d}nd}d}| j                  dkD  s| j                  dk(  rt        j                  | d|d	      }nd
t        | j                        }ddt        |      z  z   }t               dk  rd|z   }||||fz  S )Nz
rec.array(zrec.array(%s,%sdtype=%s)zarray(z)array(%s,%sdtype=%s).view(numpy.recarray)r   )r   z, rG   )	separatorprefixsuffixz
[], shape=r    r`   )r;   rH   r   r   rl   rm   r:   sizer   array2stringrM   rA   r
   )r.   
repr_dtyper   r   lstlfs         r'   rc   zrecarray.__repr__  s    ZZ
JJOOv%4::??BGG4 &(XXrww
&;<
!F,C
 F=C 99q=DJJ$.//VCAC /
 %)$46C#c&k/!!#s*rBc2z***r5   c                 ^   t        |t              r%t        j                  | d      j                  }||   }t        j                  | d      j
                  }||   d d }|< | j                  | }|j                  j                  |S |j                  t              S  | j                  |g| S )Nr;   r   )
r9   intr   rn   r0   r>   rj   r;   rq   ri   )r.   rr   rz   r0   rs   rt   ru   s          r'   fieldzrecarray.field  s    dC ,,T7;AAE;D,,T7;BB	obq!;$--%Cyy*
88G$$ 4==+s++r5   )
NNr   NNNNNFCr*   )rW   rX   rY   rZ   r   r   rn   ry   r|   rc   r   r   r   s   @r'   r   r     s=    gR IM1558,$%D#(J""+H,r5   r   c                 J    | dk(  rt        j                  dt        d       y | S )Nr   zPassing `shape=0` to have the shape be inferred is deprecated, and in future will be equivalent to `shape=(0,)`. To infer the shape and suppress this warning, pass `shape=None` instead.   
stacklevel)warningswarnFutureWarning)r   s    r'   _deprecate_shape_0_as_Noner   /  s,    zN a		)
 r5   c                    | D cg c]  }t        j                  |       } }t        |      }|| d   j                  }nt	        |t
              r|f}||| D 	cg c]  }	|	j                   }}	|t        j                  |      }
nt        |||||      j                  }
|
j                  }t        |
      t        |       k7  rt        d      |
d   j                  }t        |      }|dkD  r|d|  }t        ||
      }t        |       D ]Q  \  }}	|
|   j                  }|	j                  d|	j                  |z
   }||   }||k7  rt        d| d| d      |	||<   S |S c c}w c c}	w )a  Create a record array from a (flat) list of arrays

    Parameters
    ----------
    arrayList : list or tuple
        List of array-like objects (such as lists, tuples,
        and ndarrays).
    dtype : data-type, optional
        valid dtype for all arrays
    shape : int or tuple of ints, optional
        Shape of the resulting array. If not provided, inferred from
        ``arrayList[0]``.
    formats, names, titles, aligned, byteorder :
        If `dtype` is ``None``, these arguments are passed to
        `numpy.rec.format_parser` to construct a dtype. See that function for
        detailed documentation.

    Returns
    -------
    np.recarray
        Record array consisting of given arrayList columns.

    Examples
    --------
    >>> x1=np.array([1,2,3,4])
    >>> x2=np.array(['a','dd','xyz','12'])
    >>> x3=np.array([1.1,2,3,4])
    >>> r = np.rec.fromarrays([x1,x2,x3],names='a,b,c')
    >>> print(r[1])
    (2, 'dd', 2.0) # may vary
    >>> x1[1]=34
    >>> r.a
    array([1, 2, 3, 4])

    >>> x1 = np.array([1, 2, 3, 4])
    >>> x2 = np.array(['a', 'dd', 'xyz', '12'])
    >>> x3 = np.array([1.1, 2, 3,4])
    >>> r = np.rec.fromarrays(
    ...     [x1, x2, x3],
    ...     dtype=np.dtype([('a', np.int32), ('b', 'S3'), ('c', np.float32)]))
    >>> r
    rec.array([(1, b'a', 1.1), (2, b'dd', 2. ), (3, b'xyz', 3. ),
               (4, b'12', 4. )],
              dtype=[('a', '<i4'), ('b', 'S3'), ('c', '<f4')])
    Nr   z>mismatch between the number of fields and the number of arrayszarray-shape mismatch in array z ("z"))r:   asarrayr   r   r9   r   r;   r   r0   rA   r8   r   r<   ndim)	arrayListr;   r   r/   r0   r1   r2   r3   xru   r   rO   d0nn_arrayk	testshaper   s                     r'   r   r   ;  s   b )221A2I2 'u-E}!""	E3	5= )2239922gufgyIOO[[F 5zS^# + , 	, 
qB	RB	AvdseU#F I& 31X]]IInsxx"}-	ay=aSD6LMMt MW 3 3s   E!E&c           	      ^   |z|xt        j                  | t              }t        |j                  d         D 	cg c]*  }	t        j                  |d|	f   j                               , }
}	t        |
||||||      S |t        j                  t        |f      }nt        |||||      j                  }	 t        j                  | |      }||j                  |k7  r||_        	 |j-                  t               }|S c c}	w # t        t        f$ r t        |      }|t        |       }t        |t              r|f}t        |      dkD  rt        d      t!        ||      }t        |j"                        D ]  }t%        | |         ||<    t'        j(                  dt*        d	       |cY S w xY w)
a  Create a recarray from a list of records in text form.

    Parameters
    ----------
    recList : sequence
        data in the same field may be heterogeneous - they will be promoted
        to the highest data type.
    dtype : data-type, optional
        valid dtype for all arrays
    shape : int or tuple of ints, optional
        shape of each array.
    formats, names, titles, aligned, byteorder :
        If `dtype` is ``None``, these arguments are passed to
        `numpy.format_parser` to construct a dtype. See that function for
        detailed documentation.

        If both `formats` and `dtype` are None, then this will auto-detect
        formats. Use list of tuples rather than list of lists for faster
        processing.

    Returns
    -------
    np.recarray
        record array consisting of given recList rows.

    Examples
    --------
    >>> r=np.rec.fromrecords([(456,'dbe',1.2),(2,'de',1.3)],
    ... names='col1,col2,col3')
    >>> print(r[0])
    (456, 'dbe', 1.2)
    >>> r.col1
    array([456,   2])
    >>> r.col2
    array(['dbe', 'de'], dtype='<U3')
    >>> import pickle
    >>> pickle.loads(pickle.dumps(r))
    rec.array([(456, 'dbe', 1.2), (  2, 'de', 1.3)],
              dtype=[('col1', '<i8'), ('col2', '<U3'), ('col3', '<f8')])
    r   .)r/   r   r0   r1   r2   r3   r   zCan only deal with 1-d array.zxfromrecords expected a list of tuples, may have received a list of lists instead. In the future that will raise an errorr   r   )r:   r   r   rP   r   tolistr   r;   r   r   r   r8   r   rA   r9   r   r   r   rI   r   r   r   rq   )recListr;   r   r/   r0   r1   r2   r3   ru   r!   arrlistr   retvalr   r   rt   s                   r'   r   r     s   X 5=hhwf-49#))B-4H
/0BHHSa['')*
 
 '7%u!'IO 	O &%)UFGY

% 	!'/* !6 FL
++h
CJQ
 z" *51=LEeS!HEu:><==%'v{{# 	*Agaj)F1I	* 	Ga	) %s   /C<5D B(F,+F,c	                     ||t        d      |t        j                  |      }	nt        |||||      j                  }	|	j                  }
t        |      }|dv rt        |       |z
  |
z  }t        ||	| |      }|S )a  Create a record array from binary data

    Note that despite the name of this function it does not accept `str`
    instances.

    Parameters
    ----------
    datastring : bytes-like
        Buffer of binary data
    dtype : data-type, optional
        Valid dtype for all arrays
    shape : int or tuple of ints, optional
        Shape of each array.
    offset : int, optional
        Position in the buffer to start reading from.
    formats, names, titles, aligned, byteorder :
        If `dtype` is ``None``, these arguments are passed to
        `numpy.format_parser` to construct a dtype. See that function for
        detailed documentation.


    Returns
    -------
    np.recarray
        Record array view into the data in datastring. This will be readonly
        if `datastring` is readonly.

    See Also
    --------
    numpy.frombuffer

    Examples
    --------
    >>> a = b'\x01\x02\x03abc'
    >>> np.rec.fromstring(a, dtype='u1,u1,u1,S3')
    rec.array([(1, 2, 3, b'abc')],
            dtype=[('f0', 'u1'), ('f1', 'u1'), ('f2', 'u1'), ('f3', 'S3')])

    >>> grades_dtype = [('Name', (np.str_, 10)), ('Marks', np.float64),
    ...                 ('GradeLevel', np.int32)]
    >>> grades_array = np.array([('Sam', 33.3, 3), ('Mike', 44.4, 5),
    ...                         ('Aadi', 66.6, 6)], dtype=grades_dtype)
    >>> np.rec.fromstring(grades_array.tobytes(), dtype=grades_dtype)
    rec.array([('Sam', 33.3, 3), ('Mike', 44.4, 5), ('Aadi', 66.6, 6)],
            dtype=[('Name', '<U10'), ('Marks', '<f8'), ('GradeLevel', '<i4')])

    >>> s = '\x01\x02\x03abc'
    >>> np.rec.fromstring(s, dtype='u1,u1,u1,S3')
    Traceback (most recent call last):
       ...
    TypeError: a bytes-like object is required, not 'str'
    z2fromstring() needs a 'dtype' or 'formats' argument)Nr   )r   r   )r   r:   r;   r   itemsizer   rA   r   )
datastringr;   r   r   r/   r0   r1   r2   r3   r   r   r   s               r'   r   r     s    p }LMMgufgyIOO~~H 'u-E
Z6)h6eU
6BFMr5   c                     | j                         }	 | j                  dd       | j                         |z
  | j                  |d       S # | j                  |d       w xY w)Nr   r   )tellseek)fdposs     r'   get_remaining_sizer   >  sG    
'')C
1wwy3
QQs   $A	 	Ac	                    ||t        d      t        |      }|d}nt        |t              r|f}t	        | d      rt        |       }	nt        t        j                  |       d      }	|	5 } |dkD  r| j                  |d       t        |       }
|t        j                  |      }nt        |||||      j                  }|j                  }t        j                  |      j!                  t"        j$                        }||z  }|dk  rat'        |      }|
| z  ||j)                  d	      <   t+        |      }t        j                  |      j!                  t"        j$                        }||z  }||
kD  rt-        d
      t/        ||      }| j1                  |j2                        }||k7  rt5        d      	 ddd       |S # 1 sw Y   S xY w)a   Create an array from binary file data

    Parameters
    ----------
    fd : str or file type
        If file is a string or a path-like object then that file is opened,
        else it is assumed to be a file object. The file object must
        support random access (i.e. it must have tell and seek methods).
    dtype : data-type, optional
        valid dtype for all arrays
    shape : int or tuple of ints, optional
        shape of each array.
    offset : int, optional
        Position in the file to start reading from.
    formats, names, titles, aligned, byteorder :
        If `dtype` is ``None``, these arguments are passed to
        `numpy.format_parser` to construct a dtype. See that function for
        detailed documentation

    Returns
    -------
    np.recarray
        record array consisting of data enclosed in file.

    Examples
    --------
    >>> from tempfile import TemporaryFile
    >>> a = np.empty(10,dtype='f8,i4,a5')
    >>> a[5] = (0.5,10,'abcde')
    >>>
    >>> fd=TemporaryFile()
    >>> a = a.view(a.dtype.newbyteorder('<'))
    >>> a.tofile(fd)
    >>>
    >>> _ = fd.seek(0)
    >>> r=np.rec.fromfile(fd, formats='f8,i4,a5', shape=10,
    ... byteorder='<')
    >>> print(r[5])
    (0.5, 10, b'abcde')
    >>> r.shape
    (10,)
    Nz0fromfile() needs a 'dtype' or 'formats' argument)r   readintorbr   r   r   r   z;Not enough bytes left in file for specified shape and type.z%Didn't read as many bytes as expected)r   r   r9   r   hasattrr   openosfspathr   r   r:   r;   r   r   r   prodrl   intpr$   indexrI   r8   r   r   dataOSError)r   r;   r   r   r/   r0   r1   r2   r3   ctxr   r   r   	shapeprod	shapesizenbytesr   
nbytesreads                     r'   r   r   G  s   \ }JKK 'u-E}	E3	r: "o 299R=$'	 "CA:GGFA!"%HHUOE!e  >>HHUO((rww(7	(	q=KE%)iZ%7E%++b/"%LE,,277,;IX%D=&  %'[[-
ABB  C"CH MI"CH Ms   ,E
GGc                 n   t        | t        d      t        f      st        | d      r||t	        d      i }|t        j                  |      }n$|t        |||||	      j                  }n|||||	d}| |t	        d      t        ||| ||      S t        | t              rt        | |f||d|S t        | t        t        f      r7t        | d   t        t        f      rt        | f||d	|S t        | f||d	|S t        | t              r9|!| j                  |k7  r| j                  |      }n| }|
r|j!                         }|S t        | d      rt#        | |||
      S t        | t$              rL|!| j                  |k7  r| j                  |      }n| }|
r|j!                         }|j                  t              S t'        | dd      }|t        |t(              st	        d      t        j*                  |       } | | j                  |k7  r| j                  |      } | j                  t              S )a
  
    Construct a record array from a wide-variety of objects.

    A general-purpose record array constructor that dispatches to the
    appropriate `recarray` creation function based on the inputs (see Notes).

    Parameters
    ----------
    obj : any
        Input object. See Notes for details on how various input types are
        treated.
    dtype : data-type, optional
        Valid dtype for array.
    shape : int or tuple of ints, optional
        Shape of each array.
    offset : int, optional
        Position in the file or buffer to start reading from.
    strides : tuple of ints, optional
        Buffer (`buf`) is interpreted according to these strides (strides
        define how many bytes each array element, row, column, etc.
        occupy in memory).
    formats, names, titles, aligned, byteorder :
        If `dtype` is ``None``, these arguments are passed to
        `numpy.format_parser` to construct a dtype. See that function for
        detailed documentation.
    copy : bool, optional
        Whether to copy the input object (True), or to use a reference instead.
        This option only applies when the input is an ndarray or recarray.
        Defaults to True.

    Returns
    -------
    np.recarray
        Record array created from the specified object.

    Notes
    -----
    If `obj` is ``None``, then call the `~numpy.recarray` constructor. If
    `obj` is a string, then call the `fromstring` constructor. If `obj` is a
    list or a tuple, then if the first object is an `~numpy.ndarray`, call
    `fromarrays`, otherwise call `fromrecords`. If `obj` is a
    `~numpy.recarray`, then make a copy of the data in the recarray
    (if ``copy=True``) and use the new formats, names, and titles. If `obj`
    is a file, then call `fromfile`. Finally, if obj is an `ndarray`, then
    return ``obj.view(recarray)``, making a copy of the data if ``copy=True``.

    Examples
    --------
    >>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    >>> a
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])

    >>> np.rec.array(a)
    rec.array([[1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]],
              dtype=int64)

    >>> b = [(1, 1), (2, 4), (3, 9)]
    >>> c = np.rec.array(b, formats = ['i2', 'f2'], names = ('x', 'y'))
    >>> c
    rec.array([(1, 1.), (2, 4.), (3, 9.)],
              dtype=[('x', '<i2'), ('y', '<f2')])

    >>> c.x
    array([1, 2, 3], dtype=int16)

    >>> c.y
    array([1.,  4.,  9.], dtype=float16)

    >>> r = np.rec.array(['abc','def'], names=['col1','col2'])
    >>> print(r.col1)
    abc

    >>> r.col1
    array('abc', dtype='<U3')

    >>> r.col2
    array('def', dtype='<U3')
    Nr   zIMust define formats (or dtype) if object is None, string, or an open file)r/   r0   r1   r2   r3   z"Must define a shape if obj is None)r   r   r   )r   r   r   )r;   r   )r;   r   r   __array_interface__zUnknown input type)r9   rH   rJ   r   r8   r:   r;   r   r   bytesr   r$   rI   r   r   rq   copyr   r   rx   dictr   )ru   r;   r   r   r   r/   r0   r1   r2   r3   r   kwdsnew	interfaces                 r'   r   r     s8   l 
C$t*c*	+wsJ/G?u} 9 : 	: D		guf%y227% 	 # "&	 {=ABBu#fgNN	C	#uIE&IDII	C$	'c!fudm,sE%uEEEcDeDtDD	C	"#))u"4((5/CC((*C
	j	!5fEE	C	!#))u"4((5/CC((*Cxx!! C!6=	Jy$$?122hhsm#))u"4((5/Cxx!!r5   )NNNNNFN)NNr   NNNFN)
NNr   NNNNFNT)!rZ   r   r   collectionsr   
contextlibr   _utilsr    r   r:   r	   rl   
arrayprintr
   __all__r   rU   
sctypeDictnumfmtr   r   rm   r   r   r   r   r   r   r   r   r   r[   r5   r'   <module>r      s   
   "     . **( 
 K  KH H HVKRWW Kl KQ,w Q, Q,h	 K:>AE[ [| KEI6:U Up KEIAEH HT K;??Ce eP KGKGKR" R"r5   