numpy.empty函数dtype参数作用及重复运行输出不变原因咨询
NumPy empty() 相关疑问解答
关于指定dtype=int时的内存解析问题
操作系统不会专门寻找只含整数的内存块,你的“截断小数”猜测也不对。
np.empty()的核心逻辑是:向操作系统申请一块指定大小的连续内存,完全不做初始化操作,直接把内存里原本残留的二进制数据,按照你指定的dtype规则去解析。
比如你两次测试的内存块大小其实是一致的(默认float64和int(对应int64)都是8字节/元素,1×2的数组总大小都是16字节),只是解析规则不同:
- 第一次用默认
float64,把内存里的二进制位当成浮点数的编码来解读,得到浮点数结果; - 第二次指定
dtype=int,把同一段二进制位当成64位整数的编码来解读,得到整数结果。
你可以用view()方法验证这个逻辑:
import numpy as np # 按float64解析内存 test_float = np.empty((1,2)) # 把同一块内存按int64重新解析 test_int = test_float.view(np.int64) print("float64解析结果:") print(test_float) print("int64解析结果:") print(test_int)
运行后你会发现,test_int的输出和你第二次运行np.empty((1,2), dtype=int)的结果完全一致。
关于重复运行输出不变、改形状才变化的问题
这个现象和操作系统的内存分配机制直接相关:
- 重复运行输出不变:如果是在同一个进程中多次调用
np.empty()申请相同大小的内存,操作系统通常会把之前释放的同一块内存重新分配给你,这块内存里的残留数据自然和之前一致;如果是每次重启程序后输出还不变,大概率是你的环境关闭了地址空间布局随机化(ASLR),导致进程每次启动时的内存布局完全相同,申请到的内存位置固定,残留数据也就不变。 - 改变形状后输出变化:改变形状意味着申请的内存总大小改变,操作系统会分配一块新的、不同位置的内存,这块内存里的残留数据和之前的不一样,所以输出就会变化。
内容的提问来源于stack exchange,提问作者philen
相关产品推荐
相关产品推荐

