昇腾社区首页
中文
注册

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对象数据和期望得到的转置后数组一致