Numpy:指定`astype`输出缓冲区

kpbpu008  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(98)

我试图从文件中读取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)

字符串
有没有办法做到这一点?

iyzzxitl

iyzzxitl1#

我不确定这是你所期望的,但我很确定结果是你想要的。

a=np.arange(3, dtype=np.int8)
buf=bytearray(12)
b=np.frombuffer(buf, dtype=np.float32)
b[:]=a

# Note that it does write in the buffer
buf
# bytearray(b'\x00\x00`A\x00\x00pA\x00\x00\x80A')
import struct
struct.unpack('fff', buf)
# (14.0, 15.0, 16.0)

字符串
从时序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)会做的是在这里发生。

相关问题