class numpy.dtype(obj, align=False, copy=False)[source]

Create a data type object.

A numpy array is homogeneous, and contains elements described by a dtype object. A dtype object can be constructed from different combinations of fundamental numeric types.


Object to be converted to a data type object.

align : bool, optional

Add padding to the fields to match what a C compiler would output for a similar C-struct. Can be True only if obj is a dictionary or a comma-separated string. If a struct dtype is being created, this also sets a sticky alignment flag isalignedstruct.

copy : bool, optional

Make a new copy of the data-type object. If False, the result may just be a reference to a built-in data-type object.

See also



Using array-scalar type:

>>> np.dtype(np.int16)

Structured type, one field name ‘f1’, containing int16:

>>> np.dtype([('f1', np.int16)])
dtype([('f1', '<i2')])

Structured type, one field named ‘f1’, in itself containing a structured type with one field:

>>> np.dtype([('f1', [('f1', np.int16)])])
dtype([('f1', [('f1', '<i2')])])

Structured type, two fields: the first field contains an unsigned int, the second an int32:

>>> np.dtype([('f1', np.uint), ('f2', np.int32)])
dtype([('f1', '<u4'), ('f2', '<i4')])

Using array-protocol type strings:

>>> np.dtype([('a','f8'),('b','S10')])
dtype([('a', '<f8'), ('b', '|S10')])

Using comma-separated field formats. The shape is (2,3):

>>> np.dtype("i4, (2,3)f8")
dtype([('f0', '<i4'), ('f1', '<f8', (2, 3))])

Using tuples. int is a fixed type, 3 the field’s shape. void is a flexible type, here of size 10:

>>> np.dtype([('hello',(int,3)),('world',np.void,10)])
dtype([('hello', '<i4', 3), ('world', '|V10')])

Subdivide int16 into 2 int8’s, called x and y. 0 and 1 are the offsets in bytes:

>>> np.dtype((np.int16, {'x':(np.int8,0), 'y':(np.int8,1)}))
dtype(('<i2', [('x', '|i1'), ('y', '|i1')]))

Using dictionaries. Two fields named ‘gender’ and ‘age’:

>>> np.dtype({'names':['gender','age'], 'formats':['S1',np.uint8]})
dtype([('gender', '|S1'), ('age', '|u1')])

Offsets in bytes, here 0 and 25:

>>> np.dtype({'surname':('S25',0),'age':(np.uint8,25)})
dtype([('surname', '|S25'), ('age', '|u1')])

The required alignment (bytes) of this data-type according to the compiler.

More information is available in the C-API section of the manual.


A character indicating the byte-order of this data-type object.

One of:

‘=’ native
‘<’ little-endian
‘>’ big-endian
‘|’ not applicable

All built-in data-type objects have byteorder either ‘=’ or ‘|’.

>>> dt = np.dtype('i2')
>>> dt.byteorder
>>> # endian is not relevant for 8 bit numbers
>>> np.dtype('i1').byteorder
>>> # or ASCII strings
>>> np.dtype('S2').byteorder
>>> # Even if specific code is given, and it is native
>>> # '=' is the byteorder
>>> import sys
>>> sys_is_le = sys.byteorder == 'little'
>>> native_code = sys_is_le and '<' or '>'
>>> swapped_code = sys_is_le and '>' or '<'
>>> dt = np.dtype(native_code + 'i2')
>>> dt.byteorder
>>> # Swapped code shows up as itself
>>> dt = np.dtype(swapped_code + 'i2')
>>> dt.byteorder == swapped_code

A unique character code for each of the 21 different built-in types.


PEP3118 interface description of the data-type.


Dictionary of named fields defined for this data type, or None.


Bit-flags describing how this data type is to be interpreted.

Bit-masks are in numpy.core.multiarray as the constants ITEM_HASOBJECT, LIST_PICKLE, ITEM_IS_POINTER, NEEDS_INIT, NEEDS_PYAPI, USE_GETITEM, USE_SETITEM. A full explanation of these flags is in C-API documentation; they are largely useful for user-defined data-types.


Boolean indicating whether this dtype contains any reference-counted objects in any fields or sub-dtypes.


Boolean indicating whether the dtype is a struct which maintains field alignment.


Integer indicating how this dtype relates to the built-in dtypes.


Boolean indicating whether the byte order of this dtype is native to the platform.


The element size of this data-type object.

For 18 of the 21 types this number is fixed by the data-type. For the flexible data-types, this number can be anything.


A character code (one of ‘biufcmMOSUV’) identifying the general kind of data.

b boolean
i signed integer
u unsigned integer
f floating-point
c complex floating-point
m timedelta
M datetime
O object
S (byte-)string
U Unicode
V void

A bit-width name for this data-type.


Ordered list of field names, or None if there are no fields.


Number of dimensions of the sub-array if this data type describes a sub-array, and 0 otherwise.


A unique number for each of the 21 different built-in types.

These are roughly ordered from least-to-most precision.


Shape tuple of the sub-array if this data type describes a sub-array, and () otherwise.


The array-protocol typestring of this data-type object.


Tuple (item_dtype, shape) if this dtype describes a sub-array, and None otherwise.


The type object used to instantiate a scalar of this data-type.


newbyteorder([new_order]) Return a new dtype with a different byte order.

Previous topic

Data type objects (dtype)

Next topic