numpy与Tensor之间的转换
示例代码
import numpy as npfrom mindx.sdk.base import Tensor dtypes = [np.uint8, np.int8, np.int16, np.uint16, np.uint32, np.int32, np.int64, np.uint64, np.float16, np.float32, np.double, bool] # 列举numpy的支持的数据类型 shape = [5, 4, 3, 2] # 创建数组格式为4维的数组 try: for d in dtypes: a = np.ones(shape, dtype=d) # 创建numpy数组,类型为d t = Tensor(a) # 把numpy数组转换为Tensor对象 b = np.array(t) # 把Tensor对象转换为numpy数组 print(t.shape == shape) # 比较转换前后的数组格式 print((a == b).all()) # 比较转换前后的数组中的每一个元素 print(a.dtype == b.dtype) # 比较转换前后的数组的类型 except Exception as e: print(e)
注意事项
Tensor数据结构接收了作为参数传进来的一段缓冲区内存地址,因此在使用numpy数组进行数据预处理并转为Tensor时,要注意预处理的过程中是否对内存进行修改。
例如:transpose()函数作用是调换数组的索引值,但是该函数实际未对数据内存地址进行重新排列,仅在获取numpy数组时返回转换后的值,如将该numpy数组转为Tensor,上述代码中print((a == b).all())的结果实际上会是False。(即numpy数组为transpose转置后数组,Tensor为transpose转置前数组。)
如需使用类似transpose()这样不改变内存排列的函数,可以在transpose()处理后使用ascontiguousarray()来重新排列内存数据,使得转换后的Tensor对象数据和期望得到的转置后数组一致。
父主题: 样例演示