我试图从文件中读取8位整数值到numpy
数组中,并将其转换为32位浮点数。我 * 真的需要 * 将这些32位浮点数写入特定的内存缓冲区(我使用共享内存进行多处理)。我试图找出是否有一种方法可以直接将类型转换到我为32位浮点数预先分配的缓冲区中,而无需创建临时数组。
例如,如果有一个带有输出参数的astype
方法,如:
num_samples = 100
raw_buffer = bytearray(num_samples)
with open(filepath, 'rb') as f:
f.readinto(raw_buffer)
int_array = np.frombuffer(raw_buffer, dtype=np.int8)
float_buffer = bytearray(num_samples * 4)
int_array.astype(np.float32, out=float_buffer)
字符串
有没有办法做到这一点?
1条答案
按热度按时间iyzzxitl1#
我不确定这是你所期望的,但我很确定结果是你想要的。
字符串
从时序Angular 来看,在我的PC上,仅在10000字节数组上运行
a.astype(np.float32)
就需要4.6 μs。运行b[:]=a
需要4.1 μs。因此,如果您担心不必要的拷贝,显然,该解决方案所做的操作并不比astype
多。请注意,将
a.astype(np.float32)
替换为a.astype(np.float32).copy()
(只是为了估计额外的复制成本)使时序为8.2 μs。显然,一个拷贝的成本是4 μs。所以我不认为在我的b[:]=a
中有任何不必要的复制,否则它不会只花费4.1 μs(有从uint 8缓冲区到float 32缓冲区的隐式复制/转换,但这是无法避免的,而且你也不希望它被避免。所以我很有信心,没有什么比你的虚拟astype(dtype=np.float32, out=buffer)
会做的是在这里发生。