
    Dg                     "   d 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 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d Z ed           G d d                      Z G d dej                  Z 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!dS )(a  
Record Arrays
=============
Record arrays expose the fields of structured arrays as properties.

Most commonly, ndarrays contain elements of a single type, e.g. floats,
integers, bools etc.  However, it is possible for elements to be combinations
of these using structured types, such as::

  >>> a = np.array([(1, 2.0), (1, 2.0)], dtype=[('x', np.int64), ('y', np.float64)])
  >>> a
  array([(1, 2.), (1, 2.)], dtype=[('x', '<i8'), ('y', '<f8')])

Here, each element consists of two fields: x (and int), and y (a float).
This is known as a structured array.  The different fields are analogous
to columns in a spread-sheet.  The different fields can be accessed as
one would a dictionary::

  >>> a['x']
  array([1, 1])

  >>> a['y']
  array([2., 2.])

Record arrays allow us to access fields as properties::

  >>> ar = np.rec.array(a)

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

  >>> ar.y
  array([2., 2.])

    N)Counter)nullcontext   )
set_module   )numeric)numerictypes)	os_fspath)_get_legacy_print_mode)recordrecarrayformat_parser
fromarraysfromrecords
fromstringfromfilearray><=s|)blnBLNSr   r   r   r   r   Iic                 X    d t          |                                           D             S )z@Find duplication in a list, return a list of duplicated elementsc                 $    g | ]\  }}|d k    |S r    ).0itemcountss      G/var/www/sysmax/venv/lib/python3.11/site-packages/numpy/core/records.py
<listcomp>z"find_duplicate.<locals>.<listcomp>P   s-       D&A:: 	::    )r   items)lists    r)   find_duplicater.   N   s5     #DMM//11   r+   numpyc                   .    e Zd ZdZddZd	dZd Zd ZdS )
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, a5'``, or
        a list of format description strings  in the form
        ``['f8', 'i4', 'a5']``.
    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
    --------
    dtype, typename, sctype2char

    Examples
    --------
    >>> np.format_parser(['<f8', '<i4', '<a5'], ['col1', 'col2', 'col3'],
    ...                  ['T1', 'T2', 'T3']).dtype
    dtype([(('T1', 'col1'), '<f8'), (('T2', 'col2'), '<i4'), (('T3', 'col3'), 'S5')])

    `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.format_parser(['f8', 'i4', 'a5'], ['col1', 'col2', 'col3'],
    ...                  []).dtype
    dtype([('col1', '<f8'), ('col2', '<i4'), ('col3', '<S5')])
    >>> np.format_parser(['<f8', '<i4', '<a5'], [], []).dtype
    dtype([('f0', '<f8'), ('f1', '<i4'), ('f2', 'S5')])

    FNc                     |                      ||           |                     ||           |                     |           d S N)_parseFormats_setfieldnames_createdtype)selfformatsnamestitlesaligned	byteorders         r)   __init__zformat_parser.__init__   sH    7G,,,E6***)$$$$$r+   c                    |t          d          t          |t                    r-t          j        d t          |          D             |          }nt          j        ||          }|j        t          j        d|fg|          }|j        |j        }fd|D             | _        fd|D             | _	        t          |          | _        dS )z Parse the field formats NzNeed formats argumentc                 B    g | ]\  }}d                      |          |fS )zf{})format)r&   r!   format_s      r)   r*   z/format_parser._parseFormats.<locals>.<listcomp>   s+    QQQ
7%,,q//7+QQQr+   f1c                 ,    g | ]}|         d          S r   r%   r&   keyfieldss     r)   r*   z/format_parser._parseFormats.<locals>.<listcomp>   s!    :::c6#;q>:::r+   c                 ,    g | ]}|         d          S r$   r%   rD   s     r)   r*   z/format_parser._parseFormats.<locals>.<listcomp>   s!    888CQ888r+   )
ValueError
isinstancer-   sbdtype	enumeraterF   r8   
_f_formats_offsetslen_nfields)r6   r7   r:   rK   keysrF   s        @r)   r3   zformat_parser._parseFormats   s     ?4555gt$$ 	/HQQi>P>PQQQ EE
 HWg..E>HtUm_g66E\F{::::T:::88884888D		r+   c                    |rt          |          t          t          fv rnJt          |t                    r|                    d          }nt          dt          |          z            d |d| j                 D             | _	        ng | _	        | xj	        d t          t          | j	                  | j                  D             z  c_	        t          | j	                  }|rt          d|z            |rd |d| j                 D             | _        n	g | _        g }| j        t          |          k    r+| xj        dg| j        t          |          z
  z  z  c_        dS dS )zQconvert input field names into a list and assign to the _names
        attribute ,zillegal input names %sc                 6    g | ]}|                                 S r%   stripr&   r   s     r)   r*   z0format_parser._setfieldnames.<locals>.<listcomp>   s     DDD17799DDDr+   Nc                     g | ]}d |z  S )zf%dr%   )r&   r!   s     r)   r*   z0format_parser._setfieldnames.<locals>.<listcomp>   s.     A A Aa	 A A Ar+   zDuplicate field names: %sc                 6    g | ]}|                                 S r%   rU   rW   s     r)   r*   z0format_parser._setfieldnames.<locals>.<listcomp>   s     FFF!AGGIIFFFr+   )typer-   tuplerI   strsplit	NameErrorreprrP   _namesrangerO   r.   rH   _titles)r6   r8   r9   _dups       r)   r4   zformat_parser._setfieldnames   s     
	E{{tUm++E3'' HC(( 84;; FGGGDDeNT]N.CDDDDKKDK 	 A A5T[1A1A15,@ ,@ A A A 	A dk** 	A84?@@@ 	FFvnt}n/EFFFDLLDLF=3v;;&&LLTFdmc&kk&ABBLLLL '&r+   c                     t          j        | j        | j        | j        | j        d          }|(t          |d                  }|                    |          }|| _        d S )N)r8   r7   offsetsr9   r   )rJ   rK   r`   rM   rN   rb   _byteorderconvnewbyteorder)r6   r;   rK   s      r)   r5   zformat_parser._createdtype   se    [}l	
 
    &y|4I&&y11E


r+   )FN)F)__name__
__module____qualname____doc__r<   r3   r4   r5   r%   r+   r)   r   r   W   si        8 8t% % % %
" " " "*"C "C "CH    r+   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.
    r/   c                     t                      dk    r|                                 S t                                                      S Nq   )r   __str__super__repr__r6   	__class__s    r)   rr   zrecord.__repr__   s8    !##s**<<>>!ww!!!r+   c                     t                      dk    r!t          |                                           S t                                                      S rn   )r   r\   r'   rq   rp   rs   s    r)   rp   zrecord.__str__   s>    !##s**tyy{{###ww   r+   c                    |dv r t           j                            | |          S 	 t           j                            | |          S # t          $ r Y nw xY wt           j                            | d          j        }|                    |d           }|rW | j        |d d          }	 |j        }n# t          $ r |cY S w xY w|j        !|	                    | j
        |j        f          S |S t          d|z            )NsetfieldgetfieldrK   rK   r   %'record' object has no attribute '%s')ntvoid__getattribute__AttributeErrorrF   getry   rK   r8   viewrt   )r6   attr	fielddictresobjdts         r)   r}   zrecord.__getattribute__   s)   4447++D$777	7++D$777 	 	 	D	G,,T7;;B	mmD$'' 	-$-RaR)CY!   


 x#xx ;<<<J  "%'+", - - -s#   A 
AA&B. .B=<B=c                 \   |dv rt          d|z            t          j                            | d          j        }|                    |d           }|r | j        |g|d d         R  S t          | |d           r!t          j                            | ||          S t          d|z            )Nrw   zCannot set '%s' attributerK   r   rz   )	r~   r{   r|   r}   rF   r   rx   getattr__setattr__)r6   r   valr   r   s        r)   r   zrecord.__setattr__  s    444 !<t!CDDDG,,T7;;B	mmD$'' 	1 4=/s2A2w////tT4(( 1w**4s;;;$ &)+/&0 1 1 1r+   c                     t           j                            | |          }t          |t           j                  r-|j        j        !|                    | j        |j        f          S |S r2   )r{   r|   __getitem__rI   rK   r8   r   rt   )r6   indxr   s      r)   r   zrecord.__getitem__  sZ    g!!$-- c27## 		(C88T^SY7888 Jr+   c                       j         j        }t          d |D                       }d|z   fd|D             }d                    |          S )zPretty-print all fields.c              3   4   K   | ]}t          |          V  d S r2   )rO   )r&   names     r)   	<genexpr>z record.pprint.<locals>.<genexpr>'  s(      114SYY111111r+   z%% %ds: %%sc                 :    g | ]}|t          |          fz  S r%   )r   )r&   r   fmtr6   s     r)   r*   z!record.pprint.<locals>.<listcomp>)  s-    DDDdtWT40011DDDr+   
)rK   r8   maxjoin)r6   r8   maxlenrowsr   s   `   @r)   pprintzrecord.pprint#  sb     
 11511111f$DDDDDeDDDyyr+   )rh   ri   rj   rk   rr   rp   r}   r   r   r   __classcell__rt   s   @r)   r   r      s         
 HJ" " " " "
! ! ! ! !
- - -21 1 1        r+   r   c                   X     e Zd Zd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   a-  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
    --------
    core.records.fromrecords : Construct a record array from data.
    record : fundamental data-type for `recarray`.
    format_parser : determine a 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``:

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

    r/   Nr   FCc           	         |t          j        |          }nt          ||||
|	          j        }|&t                              | |t
          |f|          }n(t                              | |t
          |f||||          }|S )N)order)bufferoffsetstridesr   )rJ   rK   r   ndarray__new__r   )subtypeshaperK   bufr   r   r7   r8   r9   r;   r:   r   descrr6   s                 r)   r   zrecarray.__new__  s     HUOOEE!'5&'9MMSE;??7EFE?%?PPDD??7EFE?-0.5U # D DD r+   c                 d    | j         j        t          ur| j         j        | j         | _         d S d S d S r2   )rK   rZ   r   r8   )r6   r   s     r)   __array_finalize__zrecarray.__array_finalize__  s8    :?&((TZ-=-I DJJJ )(-I-Ir+   c                    	 t                               | |          S # t          $ r Y nw xY wt                              | d          j        }	 ||         d d         }n,# t
          t          f$ r}t          d|z            |d }~ww xY w | j        | }|j        j	        Mt          |j        j        t          j                  r'|                    | j        j        |j        f          S |S |                    t                    S )NrK   r   zrecarray has no attribute %srK   )objectr}   r~   r   rF   	TypeErrorKeyErrorry   rK   r8   
issubclassrZ   r{   r|   r   )r6   r   r   r   er   s         r)   r}   zrecarray.__getattribute__  s   	**4666 	 	 	D	 ,,T7;;B		OD/"1"%CC8$ 	O 	O 	O !?$!FGGQN	OdmS! 9?&#)."'22 Dxxtz	&BxCCCJ88G$$$s$    
**A B0BBc                    |dk    rAt          |j        t          j                  r"|j        t          j        t          |f          }|| j        v}	 t          
                    | ||          }t                              | d          j        pi }||vr|S |r/	 t                              | |           nJ# t          $ r |cY S w xY wn7# t          $ r* t                              | d          j        pi }||vr Y nw xY w	 ||         d d         }n,# t           t"          f$ r}t%          d|z            |d }~ww xY w | j        |g|R  S )NrK   r   z record array has no attribute %s)r   rZ   r{   r|   r8   rJ   rK   r   __dict__r   r   r   r}   rF   __delattr__	Exceptionr   r   r~   rx   )r6   r   r   newattrretr   r   r   s           r)   r   zrecarray.__setattr__  s    7??z#(BG<<?AV(FC=))Cdm+	$$T455C  00w??FL"I9$$
 &&tT2222    JJJ  	 	 	00w??FL"I9$$ %$		D/"1"%CC8$ 	 	 	 2T9 	 t}S'3''''s<   C B5 5CC1C<;C< D D:"D55D:c                    t                                          |          }t          |t                    r|j        j        o|                    t          |                     }t          |j        j        t          j
                  r'|                    | j        j        |j        f          S |S |                    t                    S |S )Nr   )rZ   )rq   r   rI   r   rK   r8   r   rZ   r   r{   r|   )r6   r   r   rt   s      r)   r   zrecarray.__getitem__  s    gg!!$'' c7## 
	y*hhtDzz**cinbg66 H884:?CI*F8GGG
xxWx--- Jr+   c                    | j         }| j         j        t          u s$t          | j         j        t          j                  s3|j        t          u r t          j         t          j        |f          }d}d}nd}d}| j        dk    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   rC   z, rS   )	separatorprefixsuffixz
[], shape=r    ro   )rK   rZ   r   r   r{   r|   rJ   sizer   array2stringr_   rO   r   )r6   
repr_dtyper   r   lstlfs         r)   rr   zrecarray.__repr__  s   Z
:?f$$Jtz,P,P$ &((Xrw
&;<<
!F,CC
 F=C 9q==DJ$../VCA A ACC /
 %)$4$4$46C#c&kk/!!##s**rBc2z***r+   c                 `   t          |t                    r(t                              | d          j        }||         }t                              | d          j        }||         d d         }|2 | j        | }|j        j        |S |                    t                    S  | j	        |g|R  S )NrK   r   )
rI   intr   r}   r8   rF   ry   rK   r   rx   )r6   r   r   r8   r   r   r   s          r)   fieldzrecarray.field.  s    dC   	,,T7;;AE;D,,T7;;B	obqb!;$-%Cy*
88G$$$ 4=+s++++r+   )
NNr   NNNNNFr   r2   )rh   ri   rj   rk   r   r   r}   r   r   rr   r   r   r   s   @r)   r   r   4  s        f fT HJHL1558   "$ $ $% % %D( ( (B    "+ + +B, , , , , , , ,r+   r   c                 N    | dk    rt          j        dt          d           d S | 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=    zzN a		) 	) 	) 	)
 tr+   z	numpy.recFc                    d | D             } t          |          }|| d         j        }nt          |t                    r|f}||d | D             }|t	          j        |          }nt          |||||          j        }|j        }	t          |          t          |           k    rt          d          |d         j        }
t          |
          }|dk    r|d|          }t          ||          }t          |           D ]R\  }}||         j        }|j        d|j        |z
           }|	|         }||k    rt          d| d| d          |||<   S|S )	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.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.core.records.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.core.records.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')])
    c                 6    g | ]}t          j        |          S r%   )rJ   asarray)r&   xs     r)   r*   zfromarrays.<locals>.<listcomp>}  s     2221A222r+   Nr   c                     g | ]	}|j         
S r%   r   )r&   r   s     r)   r*   zfromarrays.<locals>.<listcomp>  s    22239222r+   z>mismatch between the number of fields and the number of arrayszarray-shape mismatch in array z ("z"))r   r   rI   r   rJ   rK   r   r8   rO   rH   r   rL   ndim)	arrayListrK   r   r7   r8   r9   r:   r;   r   r`   d0nn_arraykr   	testshaper   s                    r)   r   r   L  s   b 32	222I 'u--E}!"	E3		 5= 32	222gufgyIIO[F 5zzS^^## + , , 	, 
qB	RB	AvvdsdeU##F I&&  31X]Insx"}n-	ayLaLLDLLLMMMtMr+   c           	      R   |Y|Wt          j        | t                    fdt          j        d                   D             }t          |||||||          S |t          j        t          |f          }	nt          |||||          j        }		 t          j        | |	          }
||
j        |k    r||
_        n# t          t          f$ r t          |          }|t          |           }t          |t                    r|f}t          |          dk    rt          d          t          ||	          }t          |j                  D ]}t#          | |                   ||<   t%          j        dt(          d	
           |cY S w xY w|
                    t                    }|S )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.core.records.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')])
    Nr   c                 l    g | ]0}t          j        d |f                                                   1S ).)rJ   r   tolist)r&   r!   r   s     r)   r*   zfromrecords.<locals>.<listcomp>  s7    PPPa28CQK..0011PPPr+   )r7   r   r8   r9   r:   r;   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   )rJ   r   r   ra   r   r   rK   r   r   r   rH   r   rO   rI   r   r   r   r[   r   r   r   r   )recListrK   r   r7   r8   r9   r:   r;   arrlistr   retvalr   r   r   r   s                 @r)   r   r     s   X 5=hwf---PPPP52;O;OPPP'7%u!'IO O O 	O &%))gufgyIIO!'///* !6!6 FL+ z"   *511=LLEeS!! 	HEu::>><===%''v{## 	* 	*Agaj))F1II 	Ga	) 	) 	) 	) %. ++h

CJs   B? ?C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.core.records.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.core.records.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.core.records.fromstring(s, dtype='u1,u1,u1,S3')
    Traceback (most recent call last)
       ...
    TypeError: a bytes-like object is required, not 'str'
    Nz2fromstring() needs a 'dtype' or 'formats' argument)Nr   )r   r   )r   rJ   rK   r   itemsizer   rO   r   )
datastringrK   r   r   r7   r8   r9   r:   r;   r   r   r   s               r)   r   r      s    p }LMMMgufgyIIO~H 'u--E
Z6)h6eU
6BBBFMr+   c                     |                                  }	 |                     dd           |                                  |z
  |                     |d           S # |                     |d           w xY w)Nr   r   )tellseek)fdposs     r)   get_remaining_sizer   K  s]    
''))C
1wwyy3
QQs   ,A A1c	                    ||t          d          t          |          }|d}nt          |t                    r|f}t	          | d          rt          |           }	nt          t          |           d          }	|	5 } |dk    r|                     |d           t          |           }
|t          j        |          }nt          |||||          j        }|j        }t          j        |                              t           j                  }||z  }|dk     rlt%          |          }|
| z  ||                    d	          <   t)          |          }t          j        |                              t           j                  }||z  }||
k    rt+          d
          t-          ||          }|                     |j                  }||k    rt3          d          	 ddd           n# 1 swxY w Y   |S )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.newbyteorder('<')
    >>> a.tofile(fd)
    >>>
    >>> _ = fd.seek(0)
    >>> r=np.core.records.fromfile(fd, formats='f8,i4,a5', shape=10,
    ... byteorder='<')
    >>> print(r[5])
    (0.5, 10, '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 typez%Didn't read as many bytes as expected)r   r   rI   r   hasattrr   openr
   r   r   rJ   rK   r   r   r   prodr{   intpr-   indexr[   rH   r   r   dataOSError)r   rK   r   r   r7   r8   r9   r:   r;   ctxr   r   r   	shapeprod	shapesizenbytesr   
nbytesreads                     r)   r   r   T  sI   \ }JKKK 'u--E}	E3		 r: ( "oo 9R==$''	 CA::GGFA!"%%HUOOEE!'5&'9MMSE>HUOO((rw(77	(	q==KKE%)iZ%7E%++b//"%LLE,,27,;;IX%D==PR R R %''[[--
ABBB  ;C C C C C C C C C C C C C C C@ Ms   ?E$G00G47G4Tc                 *   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          rBt          | d         t          t          f          rt          | f||d	|S t          | f||d	|S t          | t                    r=|!| j        |k    r|                     |          }n| }|
r|                                }|S t          | d          rt#          | |||
          S t          | t$                    rU|!| j        |k    r|                     |          }n| }|
r|                                }|                    t                    S t'          | dd          }|t          |t(                    st	          d          t          j        |           } | | j        |k    r|                     |          } |                     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]])
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])

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

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

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

    >>> c.y
    rec.array([ 1.0,  4.0,  9.0], 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)r7   r8   r9   r:   r;   z"Must define a shape if obj is None)r   r   r   )r   r   r   )rK   r   )rK   r   r   __array_interface__zUnknown input type)rI   rZ   r\   r   rH   rJ   rK   r   r   bytesr   r-   r[   r   r   r   copyr   r   r   dictr   )r   rK   r   r   r   r7   r8   r9   r:   r;   r   kwdsnew	interfaces                 r)   r   r     s   j 
C$t**c*	+	+ :wsJ/G/G :?u} 9 : : 	: D		guf%y2 227 	 # "&	  {=ABBBu#fgNNNN	C		 %"#uIE&IIDIII	C$	'	' ""c!fudm,, 	EsE%uEEEEEcDeDDtDDD	C	"	" "#)u"4"4((5//CCC 	((**C
	j	!	! "5fEEEE	C	!	! "#)u"4"4((5//CCC 	((**Cxx!!! C!6==	Jy$$?$?1222hsmm#)u"4"4((5//Cxx!!!r+   )NNNNNFN)NNr   NNNFN)
NNr   NNNNFNT)"rk   r   collectionsr   
contextlibr   _utilsr    r   rJ   r	   r{   numpy.compatr
   
arrayprintr   __all__r   rf   
sctypeDictnumfmtr.   r   r|   r   r   r   r   r   r   r   r   r   r%   r+   r)   <module>r	     s  " "F        " " " " " "                         " " " " " " . . . . . .   * ( 
   GD D D D D D D DNK K K K KRW K K KjI, I, I, I, I,w I, I, I,X	 	 	 K:>AE[ [ [ [| KEI6:Q Q Q Qh KEIAEH H H HT   K;??Ca a a aH KGKGKQ" Q" Q" Q" Q" Q"r+   