为什么python"dtype = float"是8字节而不是4字节?

cha*_*com 3 python floating-point binary numpy

这些天,我已经从Matlab转到了NumPy/SciPy.

今天,当我尝试加载以"二进制格式"存储的数据时,我遇到了一个奇怪的问题.音频数据以4字节单精度浮点数 格式存储.我先尝试了以下内容.

data = np.fromfile('out.raw', dtype=float) # This is wrong
plt.plot(data)
Run Code Online (Sandbox Code Playgroud)

但它没有用.经过一些搜索,我尝试了以下内容,它按预期工作:

data = np.fromfile('out.raw', dtype=np.float32) # This is okay.
plt.plot(data)
Run Code Online (Sandbox Code Playgroud)

根据我以前使用C/C++的经验,我曾预计"float"是一个4字节的单精度浮点类型.但事实证明浮点数是8字节数据,在上面的例子中,我应该使用np.float32.

我有两个问题.

Q1.为什么浮点数是8字节而不是4字节,这可能让C/C++程序员感到困惑?

Q2.为什么我不能使用dtype = float32.这会给我带来错误.我好像应该使用dtype = np.float32?

谢谢!

Ray*_*ger 8

这是因为float本机Python数据类型具有底层C-double.这是来自Python核心而不是numpyscipy.

numpy的SciPy的类型是更为具体,而且往往将自己的预期:

bool_   Boolean (True or False) stored as a byte
int_    Default integer type (same as C long; normally either int64 or int32)
intc    Identical to C int (normally int32 or int64)
intp    Integer used for indexing (same as C ssize_t; normally either int32 or int64)
int8    Byte (-128 to 127)
int16   Integer (-32768 to 32767)
int32   Integer (-2147483648 to 2147483647)
int64   Integer (-9223372036854775808 to 9223372036854775807)
uint8   Unsigned integer (0 to 255)
uint16  Unsigned integer (0 to 65535)
uint32  Unsigned integer (0 to 4294967295)
uint64  Unsigned integer (0 to 18446744073709551615)
float_  Shorthand for float64.
float16 Half precision float: sign bit, 5 bits exponent, 10 bits mantissa
float32 Single precision float: sign bit, 8 bits exponent, 23 bits mantissa
float64 Double precision float: sign bit, 11 bits exponent, 52 bits mantissa
complex_    Shorthand for complex128.
complex64   Complex number, represented by two 32-bit floats (real and imaginary components)
complex128  Complex number, represented by two 64-bit floats (real and imaginary components)
Run Code Online (Sandbox Code Playgroud)

如果您的问题是关于为什么核心Python float在底层C类型时使用该术语double,那么答案是Python尝试比C等低级语言更高级别的抽象.该术语float代表浮点数的概念而不是特定的C类型,如floatdouble指定大小.

相反,numpy允许对精确大小和内存布局进行较低级别的控制.这是其优化的关键.然而,这些优化和控制细节的能力是以将代码从"你正在尝试做的事情"的高级抽象转移到"指定如何完成的细节"的世界为代价的.