a :jg͏@sPdZddlZddlZddlmZddlmZddlmZddl m Z dd l m Z dd lmZgd Ze jZd d dd d dddd d dddddZe jZedddZedGdddZGddde jZedGdddeZddZedd+ddZedd,d d!Zedd-d"d#Zd$d%Zedd.d&d'Zedd/d)d*Z dS)0z< This module contains a set of functions for record arrays. N)Counter) nullcontext) set_module)numeric) numerictypes)_get_legacy_print_mode) recordrecarray format_parser fromarrays fromrecords fromstringfromfilearrayfind_duplicate><=s|)blnBLNSrrrrrIiz numpy.reccCsddt|DS)z@Find duplication in a list, return a list of duplicated elementscSsg|]\}}|dkr|qSr).0itemcountsr"r"=/usr/local/lib/python3.9/site-packages/numpy/_core/records.py 1sz"find_duplicate..)ritems)listr"r"r&r.s rc@s4eZdZdZd ddZd ddZdd Zd d ZdS)r am 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 -------- >>> np.rec.format_parser(['>> np.rec.format_parser(['f8', 'i4', 'a5'], ['col1', 'col2', 'col3'], ... []).dtype dtype([('col1', '>> np.rec.format_parser(['.f1csg|]}|dqSrr"r#keyfieldsr"r&r'csg|]}|dqSr!r"r8r:r"r&r'r<) ValueError isinstancer)sbdtype enumerater;r0 _f_formats_offsetslen_nfields)r.r/r2r@keysr"r:r&r+ys$  zformat_parser._parseFormatscCs|rXt|ttfvrn&t|tr,|d}ntdt|dd|d|jD|_ ng|_ |j ddt t |j |jD7_ t |j }|rt d||rdd|d|jD|_n g|_g}|jt |kr|jdg|jt |7_dS) zQconvert input field names into a list and assign to the _names attribute ,zillegal input names %scSsg|] }|qSr"stripr#rr"r"r&r'r<z0format_parser._setfieldnames..NcSsg|] }d|qS)zf%dr"r#r r"r"r&r'r<zDuplicate field names: %scSsg|] }|qSr"rHrJr"r"r&r'r<)typer)tupler>strsplit NameErrorreprrE_namesrangerDrr=_titles)r.r0r1Z_dupr"r"r&r,s(     zformat_parser._setfieldnamescCsDt|j|j|j|jd}|dur:t|d}||}||_dS)N)r0r/offsetsr1r)r?r@rRrBrCrT_byteorderconvZ newbyteorder)r.r3r@r"r"r&r-s  zformat_parser._createdtype)FN)F)__name__ __module__ __qualname____doc__r4r+r,r-r"r"r"r&r 8s :  $r csTeZdZdZdZdZfddZfddZddZd d Zd d Zd dZ Z S)r zEA data-type scalar that allows field access as attribute lookup. numpycstdkr|StSNq)r __str__super__repr__r. __class__r"r&r`s zrecord.__repr__cs tdkrt|StSr\)r rNr$r_r^rarbr"r&r^s  zrecord.__str__cCs|dvrtj||Sztj||WSty8Yn0tj|dj}||d}|r|j|dd}z |j}Wnty|YS0|jdur| |j |jfS|Std|dS)Nsetfieldgetfieldr@r@r%'record' object has no attribute '%s') ntvoid__getattribute__AttributeErrorr;getrfr@r0viewrc)r.attr fielddictresobjdtr"r"r&rjs(      zrecord.__getattribute__cCsz|dvrtd|tj|dj}||d}|rN|j|g|ddRSt||drjtj|||Std|dS)NrdzCannot set '%s' attributer@rrg) rkrhrirjr;rlregetattr __setattr__)r.rnvalrorpr"r"r&rts   zrecord.__setattr__cCs@tj||}t|tjr8|jjdur8||j|jfS|SdSr*)rhri __getitem__r>r@r0rmrcr.Zindxrqr"r"r&rvszrecord.__getitem__cs@jj}tdd|D}d|fdd|D}d|S)zPretty-print all fields.css|]}t|VqdSr*)rDr#namer"r"r& r<z record.pprint..z %% %ds: %%scsg|]}|t|fqSr")rsrxfmtr.r"r&r' r<z!record.pprint.. )r@r0maxjoin)r.r0maxlenrowsr"r{r&pprints z record.pprint) rWrXrYrZr`r^rjrtrvr __classcell__r"r"rbr&r s   r c sTeZdZdZdddZdd Zd d Zd d ZfddZddZ dddZ Z S)r a8Construct 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``: >>> x = np.array([(1.0, 2), (3.0, 4)], dtype=[('x', '>> x array([(1., 2), (3., 4)], dtype=[('x', '>> 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', '     zrecarray.__setattr__cspt|}t|trh|jjdurZ|t|}t|jjt j rV|j|jj|jfdS|S|jtdSn|SdS)Nr)rL) r_rvr>rr@r0rmrLrrhrirwrbr"r&rvs   zrecarray.__getitem__cCs|j}|jjtus"t|jjtjsF|jturintrrjr0r;rfr@rmre)r.rnrur0rorprqr"r"r&fields    zrecarray.field) NNrNNNNNFr)N) rWrXrYrZrrrjrtrvr`rrr"r"rbr&r sh "% $r cCs$|dkrtjdtdddS|SdS)NrzPassing `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)warningswarn FutureWarning)rr"r"r&_deprecate_shape_0_as_None-srFcCs2dd|D}t|}|dur*|dj}nt|tr:|f}|durX|durXdd|D}|durlt|}nt|||||j}|j} t|t|krt d|dj} t| } | dkr|d| }t ||} t |D]V\} }|| j } |jd|j | }| | }||kr$t d| d|d || |<q| S) aCreate 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', '.NrcSsg|] }|jqSr"r)r#rqr"r"r&r'wr<z>mismatch between the number of fields and the number of arrayszarray-shape mismatch in array z ("z")) rrr>rr?r@r r0rDr=r rAndim)Z arrayListr@rr/r0r1r2r3rrRZd0nn_arraykrqZ testshaperyr"r"r&r 9s61        r c sJ|durP|durPtj|tdfddtjdD}t|||||||dS|durhtt|f} nt|||||j} ztj|| d} Wnt t fyt |}|durt |}t |tr|f}t |dkrt dt|| } t| jD]} t|| | | <qtjd td d | YS0|dur<| j|kr<|| _| t} | S) aCreate 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='>> import pickle >>> pickle.loads(pickle.dumps(r)) rec.array([(456, 'dbe', 1.2), ( 2, 'de', 1.3)], dtype=[('col1', '.)r/rr0r1r2r3rzCan 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 errorrr)r?rrrSrr r@r r rr=rrDr>rr rrMrrrrm)ZrecListr@rr/r0r1r2r3Zarrlistrretvalrrrpr"rr&rsF,         rc Csx|dur|durtd|dur,t|} nt|||||j} | j} t|}|dvrdt||| }t|| ||d} | S)aCreate 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', '>> 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' Nz2fromstring() needs a 'dtype' or 'formats' argument)Nr)rr)rr?r@r itemsizerrDr ) Z datastringr@rrr/r0r1r2r3rrrr"r"r&rs8 rc CsB|}z&|dd||W||dS||d0dS)Nrr)tellseek)fdposr"r"r&get_remaining_size<s   rc Cst|dur|durtdt|}|dur.d}nt|tr>|f}t|drRt|} ntt|d} | }|dkr|| |dt |} |durt |} nt |||||j } | j} t |jtjd} | | }|dkrt|}| | ||d <t|}t |jtjd} | | }|| kr(td t|| }||j}||krPtd Wdn1sf0Y|S) aCreate 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)rreadintorbrrrrz;Not enough bytes left in file for specified shape and type.z%Didn't read as many bytes as expected)rrr>rhasattrropenosfspathrrr?r@r rrprodrhZintpr)indexrMr=r rdataOSError)rr@rrr/r0r1r2r3ctxrrrZ shapeprodZ shapesizenbytesrZ nbytesreadr"r"r&rEsJ.           (rTc Cs$t|tdtfst|dr4|dur4|dur4tdi} |durLt|}n,|durht||||| j}n||||| d} |dur|durtdt|||||dSt|t rt ||f||d| St|t t frt|dt t frt |f||d | St|f||d | Snt|tr\|durF|j|krF||} n|} | rX| } | St|drxt||||d St|tr|dur|j|kr||} n|} | r| } | tSt|d d} | dust| tstd t|}|dur|j|kr||}|tSdS) 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', '>> 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='>> r.col2 array('def', dtype='rLrNrr=r?r@r r bytesrr)rMrr rmcopyrrrsdictr)rqr@rrrr/r0r1r2r3rkwdsnewZ interfacer"r"r&rshV           r)NNNNNFN)NNNNNFN)NNrNNNFN)NNrNNNFN) NNrNNNNFNT)!rZrr collectionsr contextlibrZ_utilsrrr?rrhZ arrayprintr __all__rrVZ sctypeDictZnumfmtrr rir r rr rrrrrr"r"r"r&st        V  ^ X J  h