ndarray-tobytes()是否创建原始数据的副本



我写了一些代码

batch = np.ones([4, 3, 224, 224], dtype="float32")
import time
s = time.time()
batch_bytes = batch.tobytes()
e = time.time()
print(f"{(e-s)*1e3} ms")

这给出了2.2954940795898438 ms的输出

似乎是一个不小的成本,我想这个方法可以复制数据字节吗?

我以前认为数据存储在内存中的字节中,所以有一种方法可以直接获取它吗?

那么,有可能更有效地获取字节吗?

是的,它制作了一个副本,因为bytes类型必须拥有其原始数据的所有权(即副本是强制性的(。但是,您可以使用对Numpy数组进行视图而不进行任何复制

batch_bytes = batch.reshape(-1).view(np.uint8)

请注意,如果结果类型不同(1D Numpy数组(。

是的,ndarray.tobytes((会创建数据的副本,并将其存储在计算机内存的其他位置。NumPy的文档中也描述了这一点https://numpy.org/doc/stable/reference/generated/numpy.ndarray.tobytes.html

您可以通过打印对象的内存地址来轻松地测试这一点。

import numpy as np
import time
batch = np.ones([4, 3, 224, 224], dtype="float32")
s = time.time()
batch_bytes = batch.tobytes()
e = time.time()
print(f"{(e-s)*1e3} ms")
print(f"Batch object address:       {hex(id(batch))}")
print(f"batch_bytes object address: {hex(id(batch_bytes))}")

输出:

Batch object address:       0x7f16beab0990
batch_bytes object address: 0x7f16be491010

这里发布了一个相同的问题:Numpy数组:在不复制的情况下获取原始字节

要从array:ndarray中获取字节,使用array.data将获得字节的内存视图(引用(

最新更新