• [技术干货] 使用numpy实现topk函数操作(并排序)【转载】
    np.argpartition 难以解决topKtopK是常用的一个功能,在python中,numpy等计算库使用了丰富的底层优化,对于矩阵计算的效率远高于python的for-loop实现。因此,我们希望尽量用一些numpy函数的组合实现topK。pytorch 库提供了topk函数,可以将高维数组沿某一维度(该维度共N项),选出最大(最小)的K项并排序。返回排序结果和index信息。奇怪的是,更轻量级的numpy库并没有直接提供 topK 函数。numpy只提供了argpartition 和 partition,可以将最大(最小)的K项排到前K位。以argpartition为例,最小的3项排到了前3位:123>>> x = np.array([3, 5, 6, 4, 2, 7, 1])>>> x[np.argpartition(x, 3)]array([2, 1, 3, 4, 5, 7, 6])注意,argpartition实现的是 partial sorting,如上例,前3项和其余项被分开,但是两部分各自都是不排序的!而我们可能更想要topK的几项排好序(其余项则不作要求)。因此,下面提供一种基于argpartition的topK方法。一个naive方法最简单的方法自然是全排序,然后取前K项。缺点在于,要把topK之外的数据也进行排序,当K << N时较为浪费时间,复杂度为O ( n log ⁡ n ) O(n \log n)O(nlogn):123456789101112131415161718192021222324252627def naive_arg_topK(matrix, K, axis=0):    """    perform topK based on np.argsort    :param matrix: to be sorted    :param K: select and sort the top K items    :param axis: dimension to be sorted.    :return:    """    full_sort = np.argsort(matrix, axis=axis)    return full_sort.take(np.arange(K), axis=axis) # Example>>> dists = np.random.permutation(np.arange(30)).reshape(6, 5)array([[17, 28,  1, 24, 23,  8],       [ 9, 21,  3, 22,  4,  5],       [19, 12, 26, 11, 13, 27],       [10, 15, 18, 14,  7, 16],       [ 0, 25, 29,  2,  6, 20]])>>> naive_arg_topK(dists, 2, axis=0)array([[4, 2, 0, 4, 1, 1],       [1, 3, 1, 2, 4, 0]])>>> naive_arg_topK(dists, 2, axis=1)array([[2, 5],       [2, 4],       [3, 1],       [4, 0],       [0, 3]])基于partition的方法对于 np.argpartition 函数,复杂度可能下降到 O ( n log ⁡ K ) O(n \log K)O(nlogK),很多情况下,K << N,此时naive方法有优化的空间。以下方法首先选出 topK 项,然后仅对前topK项进行排序(matrix仅限2d-array)。def partition_arg_topK(matrix, K, axis=0):    """    perform topK based on np.argpartition    :param matrix: to be sorted    :param K: select and sort the top K items    :param axis: 0 or 1. dimension to be sorted.    :return:    """    a_part = np.argpartition(matrix, K, axis=axis)    if axis == 0:        row_index = np.arange(matrix.shape[1 - axis])        a_sec_argsort_K = np.argsort(matrix[a_part[0:K, :], row_index], axis=axis)        return a_part[0:K, :][a_sec_argsort_K, row_index]    else:        column_index = np.arange(matrix.shape[1 - axis])[:, None]        a_sec_argsort_K = np.argsort(matrix[column_index, a_part[:, 0:K]], axis=axis)        return a_part[:, 0:K][column_index, a_sec_argsort_K] # Example>>> dists = np.random.permutation(np.arange(30)).reshape(6, 5)array([[17, 28,  1, 24, 23,  8],       [ 9, 21,  3, 22,  4,  5],       [19, 12, 26, 11, 13, 27],       [10, 15, 18, 14,  7, 16],       [ 0, 25, 29,  2,  6, 20]])>>> partition_arg_topK(dists, 2, axis=0)array([[4, 2, 0, 4, 1, 1],       [1, 3, 1, 2, 4, 0]])>>> partition_arg_topK(dists, 2, axis=1)array([[2, 5],       [2, 4],       [3, 1],       [4, 0],       [0, 3]])大数据量测试对shape(5000, 100000)的矩阵进行topK排序,测试时间为:Kpartition(s)naive(s)108.88422.6041009.01222.45810008.90422.506500011.30522.844# 构建小顶堆跳转def sift(li, low, higt):    tmp = li[low]    i = low    j = 2 * i + 1    while j <= higt:  # 情况2:i已经是最后一层        if j + 1 <= higt and li[j + 1] < li[j]:  # 右孩子存在并且小于左孩子            j += 1        if tmp > li[j]:            li[i] = li[j]            i = j            j = 2 * i + 1        else:            break  # 情况1:j位置比tmp小    li[i] = tmp  def top_k(li, k):    heap = li[0:k]    # 建堆    for i in range(k // 2 - 1, -1, -1):        sift(heap, i, k - 1)    for i in range(k, len(li)):        if li[i] > heap[0]:            heap[0] = li[i]            sift(heap, 0, k - 1)    # 挨个输出    for i in range(k - 1, -1, -1):        heap[0], heap[i] = heap[i], heap[0]        sift(heap, 0, i - 1)    return heap  li = [0, 8, 6, 2, 4, 9, 1, 4, 6]print(top_k(li, 3))
  • [技术干货] 浅谈numpy 函数里面的axis参数的含义【转载】
    前言numpy支持对矩阵和数组进行运算,因此很多numpy的很多运算都需要指定操作的维数参数axis(当然这些axis都有带默认值的),本博客以numpy.sum求和函数为例,具体分析axis参数不同取值下的含义。先说结论设 numpy.sum的输入矩阵为a. numpy.sum的返回矩阵为rst.则矩阵a的形状为:sp=numpy.shape(a),例如sp=[m,n,p,q···]rst的形状为将sp的第axis个元素设为1,即:123sp'=spsp'[axis]=1numpy.shape(rst)==sp' 为真.例如:axis=2,如果a是矩阵则:rst的形状应该为:[m,n,1,q···]对于rst的元素rst[m',n',1,q'···]计算方法为:【注意第axis轴】下标只能取1.numpy.sum(a,axis=2)的内部计算其实为:12for i in range(sp[axis]):    rst[m'][n'][1][q'][···]+=a[m'][n'][i][q'][···]结果上发现是第axis维变成1,计算过程其实是对第axis轴进行了遍历,让sp[axis]个元素合并成一个元素。而如果a是一个array则:rst的形状应该为:[m,n,q,···]注意第axis维直接不见了numpy.sum(a,axis=2)的内部计算12for i in range(sp[axis]):    rst[m'][n'][q'][···]+=a[m'][n'][i][q'][···]结果上发现是第axis维变没了,计算过程其实是对第axis轴进行了遍历,让sp[axis]个元素合并成一个元素。举例说明简单点的12import numpy as npa=np.mat([[1,2,3],[4,5,6]])a的shape:1print (np.shape(a))输出:(2, 3)计算:np.sum(a,axis=0)123>>> s0=np.sum(a,axis=0)>>> s0matrix([[5, 7, 9]])按照【先说结论】的方法:1axis=0a的形状:(2,3)所以rst的形状为:(1,3)对于rst的每个元素p,q:rst[p][q] 的 计算方法为(其中p只能等于0,q=0,1,2):12for i in range(np.shape(a)[axis]):     rst[0][q]+=a[i][q]所以:123rst[0][0]=a[0][0]+a[1][0]=1+4=5rst[0][1]=a[0][1]+a[1][1]=2+5=7rst[0][2]=a[0][2]+a[1][2]=3+6=9所以rst就是[[5,7,9]]计算 numpy.sum(a,axis=1)a=[[1,2,3],[4,5,6]1234567>>> s1=np.sum(a,axis=1)>>> s1matrix([[ 6],        [15]])>>> np.shape(s1)(2, 1)>>> 一样的分析方法:按照【先说结论】的方法:1axis=1a的形状:(2,3)所以rst的形状为:(2,1)对于rst的每个元素p,q:rst[p][q] 的 计算方法为(其中p=0,1 ,而q只能为0):12for i in range(np.shape(a)[axis]):     rst[p][0]+=a[p][i]所以:12rst[0][0]=a[0][0]+a[0][1]+a[0][2]=1+2+3=6rst[1][0]=a[1][1]+a[1][1]+a[1][2]=4+5+6=15所以rst就是[[6],[15]].复杂点的:1234567>>> b=np.array([[[1,2,3],[4,5,6],[7,8,9]]])>>> barray([[[1, 2, 3],        [4, 5, 6],        [7, 8, 9]]])>>> np.shape(b)(1, 3, 3)b是1x3x3,是一个array.那么np.sum(b,axis=2)等于多少呢?标准答案:12>>> print (np.sum(b,axis=2))[[ 6 15 24]]分析结果:返回值应该为1x3形状的array,对于元素rst[p][q].1rst[p][q]=a[p][q][0]+a[p][q][1]+a[p][q][2]例如rst[0][1]=a[0][1][0]+a[0][1][1]+a[0][1][2]=8+5+6=15.而np.sum(b,axis=2)的第一行第二个元素正是 15.关于axis默认值一般此类针对矩阵、array的函数都有一个axis参数,并且此默认为None.当axis为None使 表示运算是遍历矩阵(array)的每一个元素的,是逐元素的计算。补充:python中某些函数axis参数的理解总结为一句话:设axis=i,则numpy沿着第i个下标变化的方向进行操作。当然,这个i是从0开始数的,作为程序员的你一定不会搞错。axis意为“轴”,它指定了函数在张量(矩阵、等等)上进行操作的方向。例如有一个ndarray,名叫A,A.shape=(3,8,5,7)。那么np.sum(A, axis=2)计算的结果的shape就是(3,8,7)。假设这个shape是(3,8,7)的ndarray变量名为B,那么实际上:B[i][j][k]=A[i][j][0][k]+A[i][j][1][k]+A[i][j][2][k]+A[i][j][3][k]+A[i][j][4][k]以下代码你可以自己跑一下试试:12345import numpy as npA=np.random.randn(3,8,5,7)print("A.shape=",A.shape)B=np.sum(A,axis=2)print("B.shape=",B.shape)预期输出为:A.shape= (3, 8, 5, 7)B.shape= (3, 8, 7)
  • [API使用] 【ModelArt产品】【Numpy fromfile】调用原版numpy fromfile函数,需要write权限问题
    在ModelArt成都智算中心平台上的Jupyter Lab调用原版numpy(非mindspore.numpy)的fromfile函数时,会报错需要File isn't open for writing。但理论上这个函数只需要读就行了,在本地运行的时候也没有问题,请问有人遇到类似的问题么。【截图信息】
  • [技术干货] Python中Numpy的深拷贝和浅拷贝(转载)
    1. 引言2. 浅拷贝2.1 问题引入2.2 问题剖析3. 深拷贝3.1 举个栗子3.2 探究原因4. 技巧总结4.1 判断是否指向同一内存4.2 其他数据类型5. 总结1. 引言深拷贝和浅拷贝是Python中重要的概念,本文重点介绍在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理。闲话少说,我们直接开始吧!2. 浅拷贝2.1 问题引入我们来举个栗子,如下所示我们有两个数组a和b,样例代码如下:12345import numpy as npa = np.array([1, 2, 3])b = aprint('a =', a)print('b =', b)输出如下:a = [1 2 3]b = [1 2 3]此时如果我们对数组a做如下改变,代码如下:123456import numpy as npa = np.array([1, 2, 3])b = aa [0] = 42print('a =', a)print('b =', b)那么我们的问题为: 此时b的值应该为多少?运行上述代码后,我们得到输出如下:a = [42 2 3]b = [42 2 3]2.2 问题剖析也许有人会觉得输出应该为??a=[42 2 3]?? 和 ??b=[1 2 3]?? ,但是运行上述代码后我们发现??a??和??b??的值均发生了相应的改变。这主要是由于在??Numpy??中对变量的赋值操作,实际上发生的为浅拷贝。换句话说,此时两个变量指向同一块内存地址,如下所示:所以,此时如果我们修改数组??original_array??中的某个元素,`copy_array??由于和??original_array`公用同一块内存,所以其中的元素也会发生相应的变化。3. 深拷贝3.1 举个栗子如果我们想要对??Numpy??数组执行深拷贝,此时我们可以使用函数??copy()??。相关的样例代码如下:12345import numpy as npa = np.array([1, 2, 3])b = a.copy()print('a =', a)print('b =', b)输出如下:a = [1 2 3]b = [1 2 3]此时,如果我们改变数组??a??中的元素,代码如下:123456import numpy as npa = np.array([1, 2, 3])b = a.copy()a [0] = 42print('a =', a)print('b =', b)此时的代码输出如下:a = [42 2 3]b = [1 2 3]3.2 探究原因观察上述输出,我们可以清楚地看到数组??a??发生了改变而数组??b??没有发生变化,这是由于我们使用了深拷贝。此时的内存地址如下:由于 ??original_array??和??copy_array??指向不同的内存地址空间,所以此时我们对??original_array??的改变并不会对??copy_array??带来影响。4. 技巧总结经过上述对深拷贝和浅拷贝的举例和示例,相信大家都已有了清晰的认识,接着我们对上述知识点进行总结,归纳如下:4.1 判断是否指向同一内存如果我们需要知道两个变量是否指向同一块内存地址,我们可以方便地使用??is??操作。浅拷贝示例:123a = np.array([1, 2, 3])b = aprint(b is a)输出如下:True深拷贝示例:123a = np.array([1, 2, 3])b = a.copy()print(b is a)输出如下:False4.2 其他数据类型尽管本文中所有的示例都使用了NumPy数组,但本文中所涉及的知识也适用于Python中的列表和字典等其他数据类型。总之,我们需要时刻记载心中:在浅拷贝中,原始数组和新的数组共同执行同一块内存;同时在深拷贝中,新的数组是原始数据的单独的拷贝,它指向一块新的内存地址。
  • [API使用] 【910产品】【dataset功能】如何将dataset中的一列输出转化为numpy
    训练时生成了一个dataset,,其中column_names=["clip", "target"]现在需要将clips转化成为numpy,并用tofile输出为二进制文件,想知道ms有没有相关的api将ds的一个列单独输出成为numpy非常感谢
  • [问题求助] 【200dk产品】【acllite功能】aclliteimage resize后转为numpy类型size不一致
    【功能模块】使用face_detection_rtsp样例中AclLiteImage的,通过接口转成numpy数据类型,前后size不一致【操作步骤&问题现象】0、5.0.4alpha0051、Preprocess对象处理rtsp流,设置resize的宽高为200,200,获取每一帧的AclLiteImage对象2、调用AclLiteImage对象的.nparray()函数转为numpy数据格式3、转成numpy后的size为62400,而非40000,why?【截图信息】代码:if __name__ == '__main__':    acl_resource = AclLiteResource()    acl_resource.init()    stream_name = "rtsp://"    cap = video.VideoCapture(stream_name)    while True:         try:            ret, image = cap.read()            if ret:                break            if (image is None) and cap.is_finished():                print("Video %s decode finish" % (stream_name))                break            if image:                print(f"AclLiteImage height:{image.height} width:{image.width} size:{image.size}")                data = image.byte_data_to_np_array()                print(f"Numpy size:{data.size} shape: {data.shape}")            time.sleep(0.0)        except Exception as e:            print(e)    del cap【日志信息】(可选,上传日志内容或者附件)
  • [数据加载及处理] 基于MindSpore NumPy进行图像拼接
    邮箱:chaojililin@163.com干货分享:MindSpore v1.7中MindSpore NumPy工具包提供了一系列类NumPy接口,不仅可以使用类NumPy语法在MindSpore上进行模型的搭建,还可以用其来进行图像处理操作,比如在数据增强场景下进行图像拼接代码:import mindspore.numpy as npimport matplotlib.pyplot as plta = plt.imread("./mindspore.jpg")# 将图像沿着水平方向重复三次。print(a.shape)b=np.concatenate((a,a,a),axis=1)print(b.shape)# 将图像沿着垂直方向重复两次c=np.concatenate((a,a),axis=0)print(c.shape)# 将图像沿着水平方向重复两次,垂直重复三次。d=np.concatenate((a,a),axis=1)d=np.concatenate((d,d,d),axis=0)print(d.shape)fig,ax = plt.subplots(2,2)fig.set_size_inches(5,5) # 画布大小ax[0,0].imshow(a)ax[0,1].imshow(b)ax[1,0].imshow(c)ax[1,1].imshow(d)plt.tight_layout() # 自动调整间距plt.show()效果图:
  • [应用实践] 【易学又易用,就在MindSpore v1.7 !】基于新特性的mindspore.numpy进行图像拼接
    邮箱:chaojililin@163.com应用体验:MindSpore v1.7中MindSpore NumPy工具包提供了一系列类NumPy接口,不仅可以使用类NumPy语法在MindSpore上进行模型的搭建,还可以用其来进行图像处理操作,比如在数据增强场景下进行图像拼接代码:import mindspore.numpy as npimport matplotlib.pyplot as plta = plt.imread("./mindspore.jpg")# 将图像沿着水平方向重复三次。print(a.shape)b=np.concatenate((a,a,a),axis=1)print(b.shape)# 将图像沿着垂直方向重复两次c=np.concatenate((a,a),axis=0)print(c.shape)# 将图像沿着水平方向重复两次,垂直重复三次。d=np.concatenate((a,a),axis=1)d=np.concatenate((d,d,d),axis=0)print(d.shape)fig,ax = plt.subplots(2,2)fig.set_size_inches(5,5) # 画布大小ax[0,0].imshow(a)ax[0,1].imshow(b)ax[1,0].imshow(c)ax[1,1].imshow(d)plt.tight_layout() # 自动调整间距plt.show()效果图:
  • [推理] 【mindspore 310】【tensor读取】C++如何读取numpy二进制文件为tensor
    【功能模块】执行推理时,需要对数据进行预处理,但是预处理部分在python的eval代码当中实现过了,于是将eval代码当中即将输入模型当中的clips(tensor)转化成为numpy再使用tofile()函数转化为bin文件在推理代码main.cc当中使用预先写好的ReadFileToTensor()函数:mindspore::MSTensor ReadFileToTensor(const std::string &file) { if (file.empty()) { std::cout << "Pointer file is nullptr" << std::endl; return mindspore::MSTensor(); } std::ifstream ifs(file); if (!ifs.good()) { std::cout << "File: " << file << " is not exist" << std::endl; return mindspore::MSTensor(); } if (!ifs.is_open()) { std::cout << "File: " << file << "open failed" << std::endl; return mindspore::MSTensor(); } ifs.seekg(0, std::ios::end); size_t size = ifs.tellg(); mindspore::MSTensor buffer(file, mindspore::DataType::kNumberTypeUInt8, {static_cast<int64_t>(size)}, nullptr, size); ifs.seekg(0, std::ios::beg); ifs.read(reinterpret_cast<char *>(buffer.MutableData()), size); ifs.close(); return buffer; }读取先前写好的二进制文件但是遇到了奇怪的事件:原本可以在eval代码中运行的clips写成二进制文件再被读取为tensor之后与模型输入不匹配了CheckAndInitInput] Input 0 data size not match, required size 308281344, given count 1233125376大小差了4倍,不知道是什么原因请问这里是因为什么导致了这个错误呢,或者有没有更好的方法将py中的tensor用于c++当中呢?非常感谢
  • [执行问题] 执行花卉识别程序xx.create_dict_iterator(output_numpy=True)._next_()出现错误
    我在华为AI开发平台上tensorflow1.15-mindspore1.5.1-cann5.0.3-euler2.8-aarch64镜像下运行花卉识别程序过程中出现如下报错相关代码如下这个程序我第一次运行的时候是可以的,然后这一次运行就不可以了,明明是一样的程序啊,数据集里也都是jpg图片, 而且我也把上次生成的模型文件删除了,不知道应该怎么解决呢写回答好问题提建议追加酬金分享邀请回答
  • [基础知识] 【MindSpore易点通】数据处理之NumPy练习--中级篇
    # NumPy使用--中级练习 ## 简述:人类早期驯服NumPy的第二篇来了,本篇内容中是用NumPy解决一些较为复杂的问题,直接上干货。 ### 1.获取2022年6月的所有日期 ```python import numpy as np cx = np.arange('2022-06','2022-07',dtype = 'datetime64[D]') print(cx) ``` ### 2.避免复制操作来计算((A+B)*(-A/2)) ```python import numpy as np A = np.ones(3)*1 B = np.ones(3)*2 print(np.multiply(np.add(A,B,out=B), np.negative(np.divide(A,2,out=A),out=A), out=A)) # 使用add()得到(A+B),使用divide()得到-A,使用negative()得到(-A/2),使用multiply()得到((A+B)*(-A/2)) ``` ### 3.用五种方法抽取随机矩阵的整数部分 ```python import numpy as np cx = np.random.uniform(0,10,(10,10)) print(cx-cx%1) print (np.floor(cx)) print (np.ceil(cx)-1) print (cx.astype(int)) print (np.trunc(cx)) ``` ### 4.创建一个5x5每行为0到4的矩阵 ```python import numpy as np print(np.tile(np.arange(5), (5, 1))) # tile()将np.arange(5)当作元素重新组成新矩阵 ``` ### 5.使用生成器创建一个大小为10的数组 ```python import numpy as np def generate(): for x in range(10): yield x cx = np.fromiter(generate(),dtype=float) print(cx) ``` ### 6.创建一个大小为10的数组,值为0到1之间,不包含0和1 ```python import numpy as np print(np.linspace(0, 1, 11, False)[1:]) # 先使用linspace()创建,再切片去掉首尾的0和1 ``` ### 7.创建一个大小为10的数组并排序 ```python import numpy as np cx = np.random.random(10) cx.sort() # 使用sort()从小到大排序 print(cx) ``` ### 8.对一个小数组用比np.sum快的方法求和 ```python import numpy as np print(np.add.reduce(np.arange(34))) # 使用add.reduce() ``` ### 9.比较两个随机数组是否相等 ```python import numpy as np cx = np.random.randint(0,3,4) cl = np.random.randint(0,3,4) print(np.allclose(cx,cl)) # 比较两个数组中的每个元素 print(np.array_equal(cx,cl)) # 比较两个整的数组 ``` ### 10.创建一个不可变数组 ```python import numpy as np cx = np.ones(10) cx.flags.writeable = False # 重置flags.writeable ``` ### 11.创建一个大小为10x2的矩阵来代表笛卡儿坐标,并转为极坐标 ```python import numpy as np cx = np.random.random((10,2)) X,Y = cx[:,0], cx[:,1] # 切分为两个 R = np.sqrt(X**2+Y**2) # 计算开放 T = np.arctan2(Y,X) print(R) print(T) ``` ### 12.创建一个大小为10的数组并把最大值设为0 ```python import numpy as np cx = np.random.random(10) cx[cx.argmax()] = 0 # 找到最大值并修改为0 print(cx) ``` ### 13.创建一个xy的数组结构,包含[0,1]x[0,1]区域 ```python import numpy as np cx = np.zeros((5,5), [('x',float),('y',float)]) cx['x'], cx['y'] = np.meshgrid(np.linspace(0,1,5), np.linspace(0,1,5)) print(cx) ``` ### 14.给定array X 和 Y, 构造柯西矩阵C(Cij = 1 /(xi-yj)) ```python import numpy as np cx = np.arange(4) cl = cx + 0.5 cxl = 1.0 / np.subtract.outer(cx, cl) print(np.linalg.det(cxl)) ``` ### 15.显示机器能处理的数值的范围 ```python import numpy as np print(np.iinfo(np.int64)) print(np.iinfo(np.int32)) print(np.iinfo(np.uint16)) print(np.finfo(np.float64)) print(np.finfo(np.float16)) ``` ### 16.显示array中所有的值 ```python import numpy as np np.set_printoptions(threshold=1) #可以用...代替中间值 Z = np.zeros((26,26)) print(Z) ``` ### 17.如何在向量中找到指定范围的最近值 ```python import numpy as np cx = np.arange(100) cl = np.random.uniform(0,100) index = (np.abs(cx-cl)).argmin() # 找到差值最小的下标 print(cx[index]) ``` ### 18.构建一个代表位置 (x,y) 和 颜色 (r,g,b)的矩阵 ```python import numpy as np mydtype = np.dtype([('xy',[('x', np.int64), ('y', np.int64)]), ('color',[('r', np.int16), ('g', np.int16), ('b', np.int16)])]) print(np.ones((3, 2), mydtype)) ``` ### 19.用一个100*2的随机向量来表示坐标,计算点到点的距离 ```python import numpy as np cx = np.random.random((100,2)) X,Y = np.atleast_2d(cx[:,0], cx[:,1]) # 切分矩阵形成向量 cl = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2) # 计算距离 print(cl) ``` ### 20.如何把一个浮点数组(int32)直接转换为整数(int32) ```python import numpy as np cx = np.random.rand(20)*10 print(cx.astype(np.int32)) # 使用astype()直接转 ``` ### 21.从文本文件中读取数据 ```python import numpy as np from io import StringIO s = StringIO(""" , , 3, 4, 5\n 6, , , 7, 8\n , , 9,10,11\n""") # 模拟.txt文件 print(np.genfromtxt(s,delimiter=',')) ``` ### 22.矩阵的坐标 ```python import numpy as np cx = np.arange(9).reshape(3,3) for index in np.ndindex(cx.shape): # 循环获取坐标和下标 print (index, cx[index]) ``` ### 23.生成二维高斯分布 ```python import numpy as np X,Y = np.meshgrid(np.linspace(-1,1,10),np.linspace(-1,1,10)) D =np.sqrt((X*X+Y*Y)) sigma, mu = 1.0, 0.0 G = np.exp(-((D-mu)**2 / (2.0 * sigma**2))) ``` ### 24.将元素P随机的放入二维数组中 ```python import numpy as np n = 6 p = 34 cx = np.zeros((n,n)) np.put(cx, np.random.choice(range(n*n), p, replace=False),1) print (cx) ``` ### 25.矩阵的第一行减去算术平均值 ```python import numpy as np X = np.random.rand(3, 4) Y = X - X.mean(axis=1, keepdims=True) # 实现减去平均值 print(Y) ``` ### 26.把数组按第n列排序 ```python import numpy as np cx = np.random.randint(0, 9, (3, 4)) print(cx) print(np.sort(cx, axis=0)) # 全部都排序 print(np.argsort(cx, axis=0)) # 给出的是索引顺序 print(cx[cx[:, 1].argsort()]) # 按第二列排序 ``` ### 27.如何判断一个二维数组有全为0的列 ```python import numpy as np cx = np.random.randint(0,3,(3,4)) print ((~cx.any(axis=0)).any()) # axis=0锁定每一列,any() 函数用于判断是否全部是0 ``` ### 28.从数组中找出给定值的最近似值 ```python import numpy as np cx = np.random.uniform(0,1,10) cl = 0.5 cxl = cx.flat[np.abs(cx - cl).argmin()] # 利用差值找到最近似的元素 print(cxl) ``` ### 29.使用迭代器计算1x3和3x1的数组的和 ```python import numpy as np A = np.arange(3).reshape(3, 1) B = np.arange(3).reshape(1, 3) cx = np.nditer([A, B, None]) # 多维数组的迭代 for x, y, z in cx: z[...] = x + y print(cx.operands[2]) ``` ### 30.创建一个有名字的数组类 ```python import numpy as np class NamedArray(np.ndarray): def __new__(cls, array, name="no name"): obj = np.asarray(array).view(cls) obj.name = name return obj def __array_finalize__(self, obj): if obj is None: return self.info = getattr(obj, 'name', "no name") cx = NamedArray(np.arange(34), "range_34") print(cx.name) ``` ### 31.对一个给定数组,如何按第二个数组表示的索引位置将对应的元素+1,注意重复的位置要重复加1 ```python import numpy as np cx = np.ones(10) cl = np.random.randint(0,len(cx),10) np.add.at(cx, cl, 1) print(cx) ``` ### 32.如何基于索引列表I,将向量X的各元素累加到数组F上 ```python import numpy as np cx = [1,2,3,4,5,6] cl = [8,9,4,5,6,7] cxl = np.bincount(cl,cx) print(cxl) ``` ### 33.对一个(w,h,3)表示的图像,如何计算不重复的颜色 ```python import numpy as np w,h = 16,16 cx = np.random.randint(0,2,(h,w,3)).astype(np.ubyte) cl = cx[...,0]*256*256 + cx[...,1]*256 +cx[...,2] print(np.unique(cx)) ``` ## 总结:以上是NumPy的中级使用的问题和解决方法,本次遇到的问题中会需要多种函数组合使用,未知函数可使用`np.info()`查看使用方法和功能,欢迎大家尝试或者补充更好的方法。高级篇正在准备中,还请期待~
  • [执行问题] 【AICC】【mindspore】【Tensor】numpy转tensor报错
    【功能模块】mindspore转numpy为tensor模块。【操作步骤&问题现象】1、torch.fft.fft2输入输出都是Tensor,但是np.fft.rfft2输入输出都是numpy array,所以在np.fft.rfft2前后进行了类型转换,但是后面用mindspore中的方法把array转换为Tensor的时候报错。2、由于经过numpy.fft.rfft2处理以后array变为复数形式,不知道是不是mindspore该模块不支持复数,如果不支持复数可能会对后续处理造成影响。【截图信息】报错信息:报错位置:np.fft.rfft2处理以后的数据:【日志信息】(可选,上传日志内容或者附件)
  • [API使用] pic.transpose
    def video_to_tensor(pic): return torch.from_numpy(pic.transpose([3,0,1,2]))看touch代码时遇到这个转化数组的,如果要将其转化为mindspore的形式,torch.from_numpy可以对于Tensor.from_numpy, 但pic.transpore怎么用mindspore表示呢?
  • [基础知识] 【MindSpore易点通】数据处理之NumPy练习--初级篇
    NumPy使用--初级练习简述:在之前几篇的分享中,我们了解了NumPy的一些基础使用。本次为掌握NumPy的更多用法和提升熟悉程度,本篇列举了33个初级题目进行练习,配有代码。后续还会有中级和高级题目。1.导入numpy模块,设置别称为npimport numpy as np2.显示numpy的版本号和配置文件import numpy as np print(np.__version__) np.show_config()3.创建一个大小为10的空向量import numpy as np print(np.empty(10)) #使用empty()函数直接创建4.查看数组占用内存大小import numpy as np cx_1 = np.empty((3,2),np.uint32) cx_2 = np.empty((3,2),np.float16) print(cx_1.itemsize * cx_2.size) #itemsize表示数组中每一个元素所占空间的大小 print(cx_2.itemsize * cx_1.size) #size返回值表示数组的大小5.查看numpy中add函数的用法import numpy as np print(np.info(np.add)) #也可使用info()查看numpy中其他函数的用法6.创建一个大小为10的空向量,将第5个值设为1import numpy as np cx = np.zeros(10) #使用zeros()函数创建空向量 cx[4] = 1 #通过下标修改值 print(cx)7.用10到49的序列构建一个向量import numpy as np cx = np.arange(10,50) #使用arange()函数传入范围创建向量 print(cx)8.将一个数组变换倒序(最后一个元素成为第一个元素)import numpy as np cx = np.arange(1,10) print(cx) cl = cx[::-1] #使用切片方法并使用-1进行倒序 print(cl)9.用0-8这9个数构造一个3x3大小的矩阵import numpy as np cx = np.arange(0,9).reshape(3,3) #arange()自带reshape()可设置矩阵大小 print(cx)10.从数组[1,2,0,0,4,0]中找出非0元素的下标import numpy as np cx = [1,2,0,0,4,0] print(np.nonzero(cx)) #使用nonzero()得出非0下标11.创建3x3的对角矩阵import numpy as np print(np.identity(3)) #identity()只能创建行列相等的矩阵,对角线上为1,其余元素为0 print(np.eye(3,3,0)) #eye()可自定义矩阵行列和对角线位置12.用随机数创建一个3x3x3的矩阵import numpy as np print(np.random.random((3,3,3))) #使用random()传入矩阵大小13.创建一个10x10的随机数矩阵,并找到最大值和最小值import numpy as np cx = np.random.random((10,10)) print(cx,cx.max(),cx.min()) #使用max()、min()找到14.创建一个大小为30的数组,并计算其算术平均值import numpy as np cx = np.random.random((30)) print(cx,cx.mean()) #使用mean()求得15.创建一个二维数组,边为1,其余为0import numpy as np cx = np.ones((6,6)) print(cx) cx[1:-1,1:-1] = 0 #切片改变矩阵四边的元素值 print(cx)16.扩展给定数组的边界import numpy as np cx = np.ones((6,6)) print(np.pad(cx,2,mode='constant',constant_values=0)) #使用pad()进行扩展17.指出下列表达式的结果是什么?import numpy as np print(0 * np.nan) #nan 有nan参与的运算,其结果也一定是nan print(np.nan == np.nan) #False nan不是数,所以无法进行比较运算 print(np.nan in set([np.nan])) #True nan在nan的字典中 print(0.3 == 3 * 0.1) #False 浮点数可以比大小,但相等要用math.isclose比较 import math print(math.isclose(0.3, 3 * 0.1)) #True18.用1,2,3,4做为对角线的下移一行,来创建5x5的矩阵import numpy as np cx = np.diag([1,2,3,4],-1) #diag()可指定对角线位置的值,并控制上下移动 print(cx)19.创建一个类似国际象棋棋盘的8x8的矩阵import numpy as np cx = np.zeros((8,8)) cx[::2,::2] = 1 cx[1::2,1::2] = 1 #切片改变不同位置的值 print(cx)20.对一个6x7x8的数组,找出第100个元素的下标import numpy as np print(np.unravel_index(100,(6,7,8))) #向unravel_index()传入要找元素的第x个和矩阵形状21.使用tile函数创建一个棋盘import numpy as np print(np.tile([[0, 1], [1, 0]], (4, 4))) #tile()将传入的第一个参数当作一个元素,再次创建22.归一化一个5x5的随机矩阵import numpy as np cx = np.random.random((5,5))*10 print(cx) print(cx - cx.mean() / cx.std()) #使用值减去平均值,再除以标准偏差的方法归一23.自定义一个用 unsigned bytes 表示RGBA颜色的dtype类型import numpy as np print(np.dtype([('R', np.ubyte), ('G', np.ubyte), ('B', np.ubyte), ('A', np.ubyte)]))24.计算5x3和3x2矩阵的内积(点乘)import numpy as np cx_1 = np.random.randint(0,9,(5,3)) cx_2 = np.random.randint(0,9,(3,2)) print(np.dot(cx_1,cx_2)) #使用dot()计算两个矩阵的内积 print(cx_1 @ cx_2)25.把一维数组中大于3小于8的所有元素变成对应负数import numpy as np cx = np.arange(1,13) cx[(cx &gt; 3) &amp; (cx&lt;8)] *= -1 #并行条件找到并修改元素值 print(cx)26.指出下列程序的输出?print(sum(range(5), -1)) # 9 from numpy import * print(sum(range(5), -1)) # 1027.对于整数向量,下面的哪些表达式是合法的?import numpy as np cx = np.array(13) print(cx**cx) # True print(2 &lt;&lt; cx &gt;&gt; 2) # False print(cx &lt;- cx) # True print(1j*cx) # True print(cx/1/1) # True print(cx&lt;cx&gt;cx) # False28.下面的表达式的结果是?import numpy as np print(np.array(0) / np.array(0)) # nan print(np.array(0) // np.array(0)) # 0 print(np.array([np.nan]).astype(int).astype(float)) # -2.14748365e+0929.对于浮点数数组取整?import numpy as np cx = np.random.uniform(-10,+10,10) #创建值在(-10,+10)的10个元素的数组 print(np.copysign(np.ceil(np.abs(cx)),cx)) #abs()将所以元素取正;ceil()将所以元素取整;copysign()根据原数组改变当前数组的正负值30.查找两个数组的交集?import numpy as np cx_1 = np.random.randint(0,10,10) cx_2 = np.random.randint(0,10,10) print(np.intersect1d(cx_1,cx_2)) #intersect1d()比较两个矩阵,找到交集31.忽略numpy的警告?import numpy as np defaults = np.seterr(all=&quot;ignore&quot;) #忽略所有警告 cx = np.ones(1) / 032.下列表达式结果为真么?import numpy as np print(np.sqrt(-1) == np.emath.sqrt(-1)) # False33.获取今天,昨天,明天的日期?import numpy as np yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D') today = np.datetime64('today', 'D') tomorrow = np.datetime64('today', 'D') + np.timedelta64(1, 'D') print(yesterday,today,tomorrow)总结:以上是本篇NumPy的初级使用,更多复杂的操作也可以通过多个简单的操作组合完成,欢迎大家尝试或者补充更好的方法。中级篇和高级篇正在准备中,还请期待~
  • [API使用] 【mindspore】【numpy功能】module &apos;mindspore&apos; has no attribute &apos;numpy&apos;
    【功能模块】mindspore.numpy【操作步骤&问题现象】module 'mindspore' has no attribute 'numpy'【截图信息】
总条数:107 到第
上滑加载中