【MindSpore易点通】数据处理之NumPy练习--中级篇

NumPy使用--中级练习

简述:人类早期驯服NumPy的第二篇来了,本篇内容中是用NumPy解决一些较为复杂的问题,直接上干货。

1.获取2022年6月的所有日期

import numpy as np

cx = np.arange('2022-06','2022-07',dtype = 'datetime64[D]')
print(cx)
复制

2.避免复制操作来计算((A+B)*(-A/2))

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.用五种方法抽取随机矩阵的整数部分

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的矩阵

import numpy as np

print(np.tile(np.arange(5), (5, 1)))  # tile()将np.arange(5)当作元素重新组成新矩阵
复制

5.使用生成器创建一个大小为10的数组

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

import numpy as np

print(np.linspace(0, 1, 11, False)[1:])  # 先使用linspace()创建,再切片去掉首尾的0和1
复制

7.创建一个大小为10的数组并排序

import numpy as np

cx = np.random.random(10)
cx.sort()  # 使用sort()从小到大排序
print(cx)
复制

8.对一个小数组用比np.sum快的方法求和

import numpy as np

print(np.add.reduce(np.arange(34)))  # 使用add.reduce()
复制

9.比较两个随机数组是否相等

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.创建一个不可变数组

import numpy as np

cx = np.ones(10)
cx.flags.writeable = False  # 重置flags.writeable
复制

11.创建一个大小为10x2的矩阵来代表笛卡儿坐标,并转为极坐标

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

import numpy as np

cx = np.random.random(10)
cx[cx.argmax()] = 0  # 找到最大值并修改为0
print(cx)
复制

13.创建一个xy的数组结构,包含[0,1]x[0,1]区域

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))

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.显示机器能处理的数值的范围

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中所有的值

import numpy as np

np.set_printoptions(threshold=1)  #可以用...代替中间值
Z = np.zeros((26,26))
print(Z)
复制

17.如何在向量中找到指定范围的最近值

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)的矩阵

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的随机向量来表示坐标,计算点到点的距离

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)

import numpy as np

cx = np.random.rand(20)*10
print(cx.astype(np.int32))  # 使用astype()直接转
复制

21.从文本文件中读取数据

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.矩阵的坐标

import numpy as np

cx = np.arange(9).reshape(3,3)
for index in np.ndindex(cx.shape):  # 循环获取坐标和下标
    print (index, cx[index])
复制

23.生成二维高斯分布

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随机的放入二维数组中

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.矩阵的第一行减去算术平均值

import numpy as np

X = np.random.rand(3, 4)
Y = X - X.mean(axis=1, keepdims=True)  # 实现减去平均值
print(Y)
复制

26.把数组按第n列排序

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的列

import numpy as np

cx = np.random.randint(0,3,(3,4))
print ((~cx.any(axis=0)).any())  # axis=0锁定每一列,any() 函数用于判断是否全部是0
复制

28.从数组中找出给定值的最近似值

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的数组的和

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.创建一个有名字的数组类

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

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上

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)表示的图像,如何计算不重复的颜色

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()查看使用方法和功能,欢迎大家尝试或者补充更好的方法。高级篇正在准备中,还请期待~

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值