• [算子使用] mindspore.scipy 入门使用指导
    1. MindSpore框架的SciPy模块    SciPy 是基于NumPy实现的科学计算库,主要用于数学、物理学、生物学等科学以及工程学领域。诸如高阶迭代,线性代数求解等都会需要用到SicPy。SciPy大体上有数值最优化、线性代数、积分、插值、信号处理、常微分方程求解等计算求解模块。    原生的SciPy科学计算库仅可CPU平台下使能,对于GPU、Ascend等计算平台无法使用且没有高效的实现。MindSpore是以Python作为表达语言的AI框架,能够合理利用GPU和Ascend的计算能力进行高效计算,并且MindSopre提供了SciPy模块。mindsopre.scipy是MindSpore基于mindspore.numpy和自研算子实现的科学计算库,不仅兼容原生的SciPy能在CPU平台高效运行,而且支持在GPU、Ascend等平台加速计算。    mindspore.scipy在CPU后端不仅能借助Minspore底层高效的CPU算子而且针对GPU平台也自实现了一系列的GPU底层高效算子。在GPU场景下能够提升硬件算力利用率,大幅提升科学计算的速度。随着后续的更新迭代,Ascend平台上也会使能高性能的mindspore.scipy模块。    除支持在不同硬件平台加速计算外,mindspore.scipy的接口定义与原生的SciPy保持高度一致,而当前业界已知的TensorFlow和PyTorch等框架中对于科学计算的接口支持与原生SciPy的接口对比存在差异。对于当前MindSpore已经支持的接口,原生的SciPy实现可以直接替换成mindspore.scipy的实现(后面的例子可以看到)。接口定义的高度一致最大程度地降低用户的迁移成本,提高minspore.scipy的易用性。2.安装mindspore.scipy    MindSpore的SciPy模块是作为科学计算的组件嵌入在MindSpore中的。当用户成功安装MindSpore框架后,minspore.scipy也会随之安装。MindSpore的安装命令由下图所示。     推荐使用采用pip的方式完成MindSpore的安装。值得注意的是,mindspore.scipy目前仅支持1.6.0及以上的版本,并且支持的平台仅包含CPU(Linux-x86_64)以及GPU(Linux-x86_64),Windows以及Ascend平台目前尚未支持。mindspore.scipy还在不断的发展,在后续的更新迭代中会逐渐更丰富、更高效、更便捷的用户接口以及更多计算平台。Linux系统下CPU的pip安装命令为:    pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.6.0/MindSpore/cpu/x86_64/mindspore-1.6.0-cp37-cp37m-linux_x86_64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simpleLinux 系统下GPU的pip安装命令为:   pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.6.0/MindSpore/cpu/x86_64/mindspore-1.6.0-cp37-cp37m-linux_x86_64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple安装成功后显示的界面如下:import mindspore import mindspore.scipy print(mindspore.__version__)如果输出1.6.0并且没有错误提示的话,说明mindspore.scipy正确安装了。除了上述的pip命令安装,还可以用别的方式(例如源码)进行安装,详细的执行步骤可以参考https://www.mindspore.cn/install。3.如何使用mindspore.scipy    从1,2小节可知,mindspore.scipy的接口是与原生SciPy高度对齐的,以下是一个简单的例子来展示如何极小程度修改原生SciPy的脚本,使能GPU计算。   以下代码是使用原生NumPy和SciPy计算一个正定对称的实数矩阵进行cholesky分解和求解线性方程的过程:import numpy as np from scipy.linalg import cho_factor as cho_factor from scipy.linalg import cho_solve as cho_solve a = np.array([[9., 3., 1., 5.], [3., 7., 5., 1.], [1., 5., 9., 2.], [5., 1., 2., 6.]]) b = np.array([1., 1., 1., 1.]) c, low = cho_factor(A) # 计算 A = L L* x = cho_solve((c, low), b) # 计算 A x = b print(np.dot(A, x) - b) # 输出 A x - b 是否为0运行上述脚本输出为:[0.00000000e+00 2.22044605e-16 0.00000000e+00 0.00000000e+00] 上述脚本中的分解和求解方程只能通过CPU进行计算,因为原生NumPy和SciPy只能在CPU上运行。安装了GPU下的MindSpore之后,将import的包改为mindspore.scipy,便可在GPU下对矩阵进行运算。修改后的脚本为:import mindspore.numpy as np # 修改为mindspore.numpy from mindspore.scipy.linalg import cho_factor as cho_factor # 修改为mindspore.scipy from mindspore.scipy.linalg import cho_solve as cho_solve # 修改为mindspore.scipy a = np.array([[9., 3., 1., 5.], [3., 7., 5., 1.], [1., 5., 9., 2.], [5., 1., 2., 6.]]) b = np.array([1., 1., 1., 1.]) c, low = cho_factor(A) x = cho_solve((c, low), b) print(np.dot(A, x) - b)运行上述脚本,输出结果为:[-5.9604645e-08 0.0000000e+00 0.0000000e+00 -5.9604645e-08] 值得注意的是,mindspore.numpy.array默认构造的浮点类型是float32,如果需要更高的精度,用户可以将对应输入数据类型指定为float64,即a = np.array([[9., 3., 1., 5.], [3., 7., 5., 1.], [1., 5., 9., 2.], [5., 1., 2., 6.]], dtype=np.float64)若用户使用mindspore.scipy时存在编译时间过长的问题,可以尝试使用动态图模式运行MindSpore。mindspore.scipy的接口支持动静态图两种模式运行。默认情况下,MindSpore的运行是图模式(GRAPH_MODE),用户进需要输入代码,即可切换为动态图模式(PYNATIVE_MODE):from mindspore import context context.set_context(mode=context.PYNATIVE_MODE)关于cholesky分解,mindspore.scipy.linalg中有mindspore.scipy.linalg.cho_factor、mindspore.scipy.linalg.cholesky两个对外接口,对应的api描述可在https://www.mindspore.cn/docs/api/zh-CN/master/api_python/scipy/mindspore.scipy.linalg.cho_factor.html#mindspore.scipy.linalg.cho_factor 中查看。4.更多的mindspore.scipy接口    更多具体的接口开放信息,可以查看对应的官方文档链接。        目前mindspore.scipy模块初步完成了scipy.linalg(线性代数)、scipy.sparse.linalg(稀疏线性代数)、scipy.optimize(数值优化)这几个模块中的部分基础接口的开发。接口和文档都在持续完善中,最新、最全面的接口信息均可在https://www.mindspore.cn/docs/api/zh-CN/master/api_python/mindspore.scipy.html 中查看。其中包含了mindspore.scipy模块支持的所有接口,以及每个接口对应的输入输出,简单用例代码等。QA     Q1:我安装了MindSpore 1.5的cpu 版本,为什么无法使用SciPy?    A1:mindspore.scipy 是r1.6以后开源到MindSpore的,用户可以安装更新的版本(r1.6)或者master上的MindSpore源码进行安装体验。    Q2:  我安装了MindSpore 1.6的cpu windows版本,为什么无法使用SciPy?    A2:mindspore.scipy 当前还未支持windows操作系统,后续会加紧迭代加入,可以使用linux-x86-64下的cpu或者gpu版本安装体验。    Q3:我想用mindspore.scipy模块下的xxx API,但是在官网的并未查询到相应的支持,怎么办?    A3:如果在官网的最新介绍中没有查询到xxx API,可以再MindSpore的社区提issue给社区维护人员,我们会根据计划尽快开发xxx API。         MindSpore码云:https://gitee.com/mindspore/mindspore         MindSpore官网:https://www.mindspore.cn
  • [问题求助] 【Atlas200 DK】【MindStudio运行python脚本】no module named ‘numpy’
    MindStudio运行python脚本时,出现no module named ‘numpy’错误。在哪里配置解决这个问题呢?
  • [问题求助] 【Atlas 200 DK产品】【离线模型推理功能】numpy类数据推理报错问题
    【功能模块】离线模型推理功能【操作步骤&问题现象】1、air转om格式成功了2、运行主函数在导入数据部分报错,对于报错,验证过data.size就是int,不知道为什么会报这个错【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] Python进阶—Numpy[转载]
    原文链接:https://blog.csdn.net/qq_49821869/article/details/122388098一、Numpy的属性ndim 维度shape 形状dtype 类型size 大小array = np.array([[1,2,3],                 [4,5,6]])print(array)123[[1 2 3] [4 5 6]]12print(array.ndim) # 维度121print(array.shape) # 形状1(2, 3)1print(array.dtype) # 元素类型1int641print(array.size) # 大小161二、创建array指定数据属性创建一维数据、二维数据zeros 全0、 ones 全1、 empty 全接近于0、 arange 等差一维数组reshape 改变矩阵形状a = np.array([1,2,3],dtype=np.int32) # 指定数据类型print(a)12[1 2 3]1b = np.array([1,2,3],dtype=np.float) # 指定数据类型 print(b.dtype)12float641c = np.array([1,2,3]) # 一维数据print(c)12[1 2 3]1d = np.array([[1,2,3],[4,5,6]]) # 二维数据print(d)12[[1 2 3] [4 5 6]]12zero = np.zeros((2,3)) # 生成2行3列的全0矩阵print(zero)12[[0. 0. 0.] [0. 0. 0.]]12one = np.ones((3,4)) # 生成3行4列的全1矩阵print(one)12[[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]]123empty = np.empty((3,3)) # 生成3行3列的全都接近于0(不等于0)的矩阵print(empty)12[[6.92430951e-310 4.67278860e-310 6.92414190e-310] [6.92414190e-310 6.92414190e-310 6.92414190e-310] [6.92414190e-310 6.92414190e-310 3.95252517e-322]]123e = np.arange(5) print(e)12[0 1 2 3 4]1f = np.arange(4,12)print(f)12[ 4  5  6  7  8  9 10 11]1g = np.arange(4,12,2)print(g)12[ 4  6  8 10]1h = np.arange(8).reshape(4,2) # 重新定义矩阵的形状print(h)12[[0 1] [2 3] [4 5] [6 7]]三、Numpy的运算‘+ - * / // ** % >’np.dot(arr1,arr2) == arr1.dot(arr2) 矩阵乘法arr1.T == np.transpose(arr1)arr1 = np.array([1,2,3])arr2 = np.array([4,5,6])print(arr1,arr2)123[1 2 3] [4 5 6]1print(arr1+arr2)1[5 7 9]1print(arr1-arr2)1[-3 -3 -3]1print(arr1*arr2)1[ 4 10 18]1print(arr1/arr2)1[0.25 0.4  0.5 ]1print(arr1**arr2)1[  1  32 729]1print(arr1 // arr2)1[0 0 0]1print(arr1 % arr2)1[1 2 3]1print(arr1 + 1)1[2 3 4]1print(arr1 * 3)1[3 6 9]1print(arr1 > 3)1[False False False]1arr3 = np.arange(6).reshape(3,2)arr4 = np.arange(6).reshape(2,3)12np.dot(arr3,arr4) # 矩阵乘法1array([[ 3,  4,  5],       [ 9, 14, 19],       [15, 24, 33]])arr3.dot(arr4)1array([[ 3,  4,  5],       [ 9, 14, 19],       [15, 24, 33]])123print(arr3.T) # 矩阵转置1[[0 2 4] [1 3 5]]12print(arr3)1[[0 1] [2 3] [4 5]]123print(np.transpose(arr3))1[[0 2 4] [1 3 5]]12四、随机数生成及矩阵的统计np.random.random 0-1的随机数np.random.normal 符合正态分布的随机数np.random.randint(0,10,size=()) 生成从0到10的size形状的随机整数np.sum() 求和、np.mean() 求平均值 np.max() 求最大值、 np.min() 求最小值np.sort() 排序、np.sqrt() 开方、 np.median() 求中位数、 axis=0 0行1列np.argmin() 求最小值的下标、np.argmax() 求最大值下标arr1 = np.random.random((2,2)) # 生成2行2列从0到1的随机数print(arr1)12[[0.70322893 0.62660424] [0.10822154 0.70288038]]12arr2 = np.random.normal(size=(3,3)) # 生成3行3列的符合标准正态分布的随机数print(arr2)12[[ 0.27050106  0.66089326  0.05234379] [ 0.81437662 -0.41467658  2.49832908] [-0.17560416  0.42175065 -1.02400744]]123arr3 = np.random.randint(0,10,size=(4,3)) # 生成4行3列的从0到10的随机整数print(arr3)12[[4 1 9] [8 7 9] [9 1 9] [5 0 9]]np.sum(arr1) # 求和 == arr1.sum()12.14093509458232761np.min(arr1) # 求最小值 == arr1.min()10.108221541469485151np.max(arr1) # 求最大值 == arr1.max()10.70322892713526411np.sum(arr1,axis=0) # 对列求和1array([0.81145047, 1.32948463])1np.sum(arr1,axis=1) # 对行求和1array([1.32983317, 0.81110192])1np.argmin(arr1) # 求最小值的索引 从0开始121np.argmax(arr1) # 求最大值的索引101np.mean(arr1) # 求平均值 == np.sum(arr1) / arr1.size == arr1.mean()10.53523377364558191np.median(arr1) # 求中位数10.66474231298878931np.sqrt(arr1) # 开方 == arr1 ** 0.51array([[ True,  True],       [ True,  True]])12np.sort(arr1) # 排序 每一行是升序1array([[0.62660424, 0.70322893],       [0.10822154, 0.70288038]])12np.clip(arr1,0.5,0.6) # 小于0.5变成0.5 大于0.6就变成0.61array([[0.6, 0.6],       [0.5, 0.6]])12五、Numpy索引索引arr1[1,2] == arr1[1][2]切片 [:,:] 逗号前面代表行,后面代表列遍历行、遍历列、遍历元素print(arr1)1[[0.62660424 0.70322893] [0.10822154 0.70288038]]12print(arr1[0]) 1[0.62660424 0.70322893]1print(arr1[0][1]) == print(arr1[0,1])  10.70322892713526411print(arr1[:,1]) # 第二列1[0.70322893 0.70288038]print(arr1[1,1])0.7028803828361643for i in arr1: # 迭代行    print(i)[0.62660424 0.70322893][0.10822154 0.70288038]for i in arr1.T: # 迭代列    print(i)[0.62660424 0.10822154][0.70322893 0.70288038]arr1.reshape(1,-1)array([[0.62660424, 0.70322893, 0.10822154, 0.70288038]])for i in arr1.flat: # 迭代所有元素    print(i)0.62660424314141430.70322892713526410.108221541469485150.7028803828361643六、合并一维数据合并 np.vstack 垂直合并、 np.hstack 水平合并多维数据合并 np.concatenate((arr1,arr2)) # 默认垂直合并、np.concatenate((arr1,arr2),axis=1) # 水平合并增加一个新的维度np.newaxis变成nd数据 np.atleast_nd n可以为1、2、3、4…arr1 = np.arange(3)arr2 = np.arange(3)print(arr1,arr2)[0 1 2] [0 1 2]np.vstack((arr1,arr2)) # 垂直合并array([[0, 1, 2],       [0, 1, 2]])np.hstack((arr1,arr2)) # 水平合并array([0, 1, 2, 0, 1, 2])np.concatenate((arr1,arr2)) array([0, 1, 2, 0, 1, 2])arr3 = np.arange(4).reshape(2,2) np.concatenate((arr3,arr3))array([[0, 1],       [2, 3],       [0, 1],       [2, 3]])np.concatenate((arr3,arr3),axis=1)  # 该方法不能对1维数据进行垂直合并array([[0, 1, 0, 1],       [2, 3, 2, 3]])arr1.T # 一维数据不能转置array([0, 1, 2])arr1[np.newaxis,:] # 在行这个维度上增加一个维array([[0, 1, 2]])arr1[:,np.newaxis]array([[0],       [1],       [2]])np.atleast_2d(arr1)array([[0, 1, 2]])七、分割等分 np.split 0行1列不等分 np.array_split 0行1列垂直分np.hsplit、水平分np.vsplitarr1 = np.arange(12).reshape(3,4)print(arr1)[[ 0  1  2  3] [ 4  5  6  7] [ 8  9 10 11]]np.split(arr1,2,axis=1) # 竖直方向分割,平均为2份 1[array([[0, 1],        [4, 5],        [8, 9]]), array([[ 2,  3],        [ 6,  7],        [10, 11]])]12345np.split(arr1,3,axis=0) # 水平方向分割,平均为3份1[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]1np.split(arr1,3,axis=1) # 竖直方向分割,平均为3份1---------------------------------------------------------------------------TypeError                                 Traceback (most recent call last)/opt/conda/lib/python3.6/site-packages/numpy/lib/shape_base.py in split(ary, indices_or_sections, axis)    866     try:--> 867         len(indices_or_sections)    868     except TypeError:TypeError: object of type 'int' has no len()During handling of the above exception, another exception occurred:ValueError                                Traceback (most recent call last)<ipython-input-112-2e738d9e1da7> in <module>----> 1 np.split(arr1,3,axis=1) # 水平方向分割,平均为3份<__array_function__ internals> in split(*args, **kwargs)/opt/conda/lib/python3.6/site-packages/numpy/lib/shape_base.py in split(ary, indices_or_sections, axis)    871         if N % sections:    872             raise ValueError(--> 873                 'array split does not result in an equal division')    874     return array_split(ary, indices_or_sections, axis)    875 ValueError: array split does not result in an equal divisionnp.array_split(arr1,3,axis=1) # 竖直方向分割,不等分为3份1[array([[0, 1],        [4, 5],        [8, 9]]), array([[ 2],        [ 6],        [10]]), array([[ 3],        [ 7],        [11]])]np.vsplit(arr1,3) # == np.split(arr1,3,axis=0) # 水平方向分割,平均为3份1[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]1np.hsplit(arr1,2)# == np.split(arr1,2,axis=1) # 竖直方向分割,平均为2份 1[array([[0, 1],        [4, 5],        [8, 9]]), array([[ 2,  3],        [ 6,  7],        [10, 11]])]12345八、深浅拷贝Python是引用传递,默认内存共享arr1.copy() 深拷贝 完全独立开arr11array([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])123arr2 = arr11arr2[0] = 0arr212array([[ 0,  0,  0,  0],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])123arr11array([[ 0,  0,  0,  0],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])123arr3 = arr1.copy() # 深拷贝1arr3[0] = 11arr31array([[ 1,  1,  1,  1],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])123arr11array([[ 0,  0,  0,  0],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])
  • [行业资讯] NumPy 1.22.0 发布
    NumPy 1.22.0 是一个大型版本,其中包含153位贡献者的工作,分布在609个拉取请求中。此版本进行多项改进,其中值得关注的有:主命名空间的注解基本完成,上游是一个不断变化的目标,因此可能会有进一步的改进,但主要工作已经完成。这可能是此版本中用户最明显的增强功能。提供了提议的 Array-API 的初步版本、NumPy 现在有一个 DLPack 后端。此外,该版本的Python 版本为 3.8-3.10,Python 3.7已被删除。
  • [Atlas200] 如何将通过网络udp接收到的numpy.ndarray格式的图片
    华为的老师们好,我们遇到的问题是在昇腾1.0.9.alpha版本驱动的代码仓的环境下,如何将通过网络udp接收到的numpy.ndarray格式的图片转换为深度学习网络需要的AclImage类格式的图片,希望华为的老师们可以指导一下,谢谢
  • [其他] PyTorch 和 NumPy的转换
    NumPy 是Python 编程语言的库,增加了对大型、多维数组和矩阵的支持,以及对这些数组进行操作的大量高级数学函数集合。将Torch中Tensor 转换为 NumPy 数组,反之亦然是轻而易举的!Torch Tensor 和 NumPy 数组将共享它们的底层内存位置 ,改变一个将改变另一个。「将 Torch 张量转换为 NumPy 数组:」a = torch.ones(5) print(a)输出:tensor([1., 1., 1., 1., 1.])b = a.numpy() print(b)输出:[1., 1., 1., 1., 1.]让我们执行求和运算并检查值的变化:a.add_(1) print(a) print(b)输出:tensor([2., 2., 2., 2., 2.]) [2. 2. 2. 2. 2.]「将 NumPy 数组转换为 Torch 张量:」import numpy as no a = np.ones(5) b = torch.from_numpy(a) np.add(a, 1, out=a) print(a) print(b)输出:[2. 2. 2. 2. 2.] tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
  • [活动体验] 数据处理中的py 函数操作
    ```C++ // 导入自定义.h文件 #include "minddata/dataset/kernels/py_func_op.h" // 导入系统标准库文件 #include #include // 导入自定义.h文件 #include "minddata/dataset/core/tensor.h" #include "minddata/dataset/kernels/tensor_op.h" #include "minddata/dataset/util/status.h" // 双重命名空间 namespace mindspore { namespace dataset { Status PyFuncOp::Compute(const TensorRow &input, TensorRow *output) { IO_CHECK_VECTOR(input, output); // PyFunc 调用成功 Status ret = Status(StatusCode::kSuccess, "PyFunc Call Succeed"); { // 获取 Python GIL py::gil_scoped_acquire gil_acquire; if (Py_IsInitialized() == 0) { // Python 解释器完成 ret = Status(StatusCode::kMDPythonInterpreterFailure, "Python Interpreter is finalized"); goto ComputeReturn; } try { // 将输入张量向量转换为 numpy 数组向量 py::tuple input_args(input.size()); py::object ret_py_obj; if (input.size() > 0) { // 遍历 for (size_t i = 0; i input.size(); i++) { py::array new_data; RETURN_IF_NOT_OK(input.at(i)->GetDataAsNumpy(&new_data)); // 可能的 memcpy 在这里 input_args[i] = new_data; } // 调用python函数 ret_py_obj = this->py_func_ptr_(*input_args); } else { ret_py_obj = this->py_func_ptr_(); } if (output_type_ != DataType::DE_UNKNOWN) { RETURN_IF_NOT_OK(CastOutput(ret_py_obj, output)); } else { if (py::isinstance(ret_py_obj)) { // 在 n-m 映射的情况下,返回值将是一个 numpy 数组的元组 py::tuple ret_py_tuple = ret_py_obj.cast(); // 同时迭代两个容器进行内存复制 for (size_t i = 0; i ret_py_tuple.size(); i++) { py::object ret_py_ele = ret_py_tuple[i]; // 如果pyfunc超时,则对象为none if (ret_py_ele.is_none()) { MS_LOG(INFO) "PyFunc execute time out"; goto TimeoutError; } if (!py::isinstance(ret_py_ele)) { goto ShapeMisMatch; } std::shared_ptr out; RETURN_IF_NOT_OK(Tensor::CreateFromNpArray(ret_py_ele.cast(), &out)); output->push_back(out); } } else if (py::isinstance(ret_py_obj)) { // 在 n-1 映射的情况下,返回值将是一个 numpy 数组 std::shared_ptr out; RETURN_IF_NOT_OK(Tensor::CreateFromNpArray(ret_py_obj.cast(), &out)); output->push_back(out); // 尾插 } else { goto ShapeMisMatch; } } } catch (const py::error_already_set &e) { ret = Status(StatusCode::kMDPyFuncException, e.what()); } } ComputeReturn: return ret; ShapeMisMatch: // PyFunc 应该返回一个 numpy 数组或一个 numpy 数组元组 ret = Status(StatusCode::kMDShapeMisMatch, __LINE__, __FILE__, "PyFunc should return a numpy array or a numpy array tuple"); goto ComputeReturn; TimeoutError: // PyFunc 执行超时 ret = Status(StatusCode::kMDTimeOut, __LINE__, __FILE__, "PyFunc execute time out"); goto ComputeReturn; } Status PyFuncOp::CastOutput(const py::object &ret_py_obj, TensorRow *output) { try { std::shared_ptr out; switch (output_type_) { case DataType::DE_INT32: RETURN_IF_NOT_OK(Tensor::CreateEmpty(TensorShape({1}), DataType(DataType::DE_INT32), &out)); RETURN_IF_NOT_OK(out->SetItemAt({0}, ret_py_obj.cast())); break; case DataType::DE_BOOL: RETURN_IF_NOT_OK(Tensor::CreateScalar(ret_py_obj.cast(), &out)); break; default: // 未找到指定数据类型的强制转换 RETURN_STATUS_UNEXPECTED("No cast for the specified DataType was found."); } output->push_back(out); // 尾插 } catch (const std::exception &e) { return Status(StatusCode::kMDUnexpectedError, e.what()); } return Status::OK(); } Status PyFuncOp::to_json(nlohmann::json *out_json) { nlohmann::json args; args["tensor_op_name"] = py_func_ptr_.attr("__class__").attr("__name__").cast(); args["is_python_front_end_op"] = true; *out_json = args; // 轻量级 return Status::OK(); } bool PyFuncOp::IsRandom() { bool random = true; if (py::hasattr(py_func_ptr_, "random") && py::reinterpret_borrow(py_func_ptr_.attr("random")) == false) random = false; return random; } } // 命名空间 dataset } // 命名空间 mindspore ```
  • [其他] 傅立叶变换处理图像的原理(3)
    在Python中,我们可以利用Numpy模块中的numpy.fft  轻松实现快速傅立叶变换(FFT)运算操作。在理解了傅里叶变换背后的基本理论之后,我们就可以研究如何控制频谱输出来处理图像了。首先,我们需要了解低/高通滤波器。低通滤波器低通滤波器是一种只允许低频谱通过的滤波器。图像中的低频谱意味着像素值变化缓慢。例如,图像中颜色变化较小的平滑区域(如新空白白纸的中心)被视为低频谱内容。由于低通滤波器的输出只允许低频通过,对噪声等高频谱内容进行了阻塞,使得处理后的图像具有较少的噪声像素。因此,低通滤波器被广泛应用于图像的去噪。高通滤波器相反,高通滤波器是只允许高频谱通过的滤波器。图像中的高频谱意味着像素值变化很大。例如,图像中颜色变化较大的边缘区域,如两张重叠的白纸和黑纸之间的边缘,被认为是高频谱内容。在图像中,通过做适当的重复计算来锐化原图像,能用适当的重复计算来锐化原始图像的图像,从高通滤波器的输出可获得图像中的边缘。这将增强原始图像的清晰度,使边缘更加清晰。从图e(5)和图f(5),我们可以注意到这两个滤波器呈现不同的特性。低通滤波器倾向于保留图像中的整体信息。另一方面,高通滤波器试图辨别出图像中的变化。在了解了前一节中的低通/高通滤波器的工作原理后,让我们继续认识滤波器形状理想的滤波器公式 (a): 在理想低通滤波器的公式中,D₀是合理常量,D(u,v)是频域中一点(u,v)与频域矩形中心之间的距离在理想滤波器背后的概念非常简单:给定一个半径值D₀作为阈值,低通滤波器图(g)(1)在阈值下H(u,v)等于1,在阈值以上H(u,v)等于0。公式(b): 在理想高通滤波器的公式中,D₀是合理常量,D(u,v)是频域中一点(u,v)与频域矩形中心之间的距离相反,高通滤波器图(g)(2)在阈值下H(u,v)等于0,在阈值以上H(u,v)等于1。巴特沃思(Btterworth)滤波器公式(c): 在Butterworth低通滤波器的公式中, D₀是一个合理常量, D(u,v)是频域中一点(u,v)与频域矩形中心之间的距离与理想滤波器不同的是,巴特沃斯滤波器没有明显的不连续性,使得通过的频率和被过滤的频率之间有明显的边界。巴特沃斯滤波器在函数中引入了一个新的参数n。当操作n时,它影响着通过的频率和被过滤的频率之间边界的清晰程度。图(h)和图(i)公式(d): 在Butterworth高通滤波器的公式中, D₀是一个合理常量,D(u,v)是频域中一点(u,v)与频域矩形中心之间的距离
  • [问题求助] openEuler20.09安装 boost_python* numpy* python36-numpy报错
    【功能模块】在openEuler 20.09系统下安装 依赖包时出错,麻烦看看怎样才能安装这3个依赖包呢?谢谢,在centos 7.6下,可以安装成功。 yum -y install zlib* lapack* blas* python3.aa4 cmake3* boost_python* boost boost-devel numpy* python36-numpy flex bison【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [执行问题] 【mindspore】【cpu编程】显示图模式不支持min函数、不支持numpy
    【功能模块】win10 64位minspore 1.5python 3.7.5【操作步骤&问题现象】1、使用min函数时显示图模式不支持该函数     NameError: mindspore\ccsrc\pipeline\jit\parse\function_block.cc:190 HandleNamespaceInfo] The builtin function 'min' of python is not supported in graph mode.2、在类里使用numpy的函数时总是无故报错,在construct函数里更是显示     NotImplementedError: Mindspore does not support to use the numpy methods within the construct() or @ms_function decorated function in graph mode.【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [开发环境] 时出现TypeError: &apos;numpy.float64&apos; cannot be interpr...报错
    【功能模块】numpy【操作步骤&问题现象】1、就在“开发环境“里的notebook里面运行了eval.py并且一开始非常顺利,但突然就报了有关numpy的错误2、经百度该问题有可能是numpy版本太高所导致的,共有两种解决方法:第一种方法是numpy版本降级,可是降级后发现其他高级一点的功能又用不了了,又会报错;第二种方法是在cocoeval.py下改几行代码内容(将SetDetParams()函数下的某些变量改一下),但是当我尝试着进入以下路径去改代码,发现在terminal端没有办法进入cocoeval.py里改代码,是因为用户只能进入work文件夹而miniconda3文件夹进不去?(非常想知道有什么办法可以查看并进入miniconda3文件夹修改代码内容)
  • [执行问题] mindspore的tensor与numpy数据类型转换
    1、如果mindspore的requires_grad=False的Tensor转化为numpy类型进行处理然后再转化会Tensor,会对计算图和反向传播有影响吗?2、如果Tensor的requires_grad=True进行numpy类型转化再转换回Tensor会对计算图和反向传播有影响吗?
  • [Atlas500] 【500产品】在小站内使用pip install numpy出现这种报错
    出现这种问题是因为小站没有连接外网没?
  • [算子编译] mindspore.numpy如何修改数值
    【功能模块】运行如下代码:运行结果ops.zeros和mindspore.numpy.zeros运行结果是一样的,都无法通过赋值的方式改变元素值,想知道该如何修改里面的某个元素值?【截图信息】【日志信息】(可选,上传日志内容或者附件)