Numpy最全介绍!!!建议收藏!!!(二)

Numpy最全介绍!!!建议收藏!!!(二)

一、文件操作

numpy中,为了处理大量的数据,通常使用.csvnumpy自带的.npy文件

保存csv文件
import numpy as np

scores = np.random.randint(0, 10, size=(20, 2))
print(scores)

np.savetxt("score.csv", scores, delimiter=",", header="英语,数学", comments="", fmt="%d")
# 注意,这里的header="英语,数学",其中的逗号是英文格式下的,delimiter=","表示以","分割

读取csv文件
sc = np.loadtxt("score.csv", dtype=np.int8, delimiter=",", skiprows=1)
print(sc)
#skiprows=1表示跳过表头那一行,直接读取数据

numpy也可以直接使用自带的.npy文件,操作简单,在实际开发中这个用的比较多

#保存.npy文件
sc1=np.random.randint(0,10,size=(2,3))
np.save("sc1",sc1)
#读取.npy文件
sc2=np.load("sc1.npy")
print(sc2)
二、读取csv 文件代码(实战版)
import numpy as np

def read_csv_demo1():
    with open('score.csv', 'r') as fp:
        # reader是一个迭代器
        reader = csv.reader(fp)
        next(reader)  # 跳过第一行表头
        for x in reader:
            English = x[0]
            Math = x[1]
            print({'English': English, 'Math': Math})


read_csv_demo1()


def read_csv_demo2():
    with open('score.csv', 'r') as fp:
        # 使用DictReader创建的reader对象
        # 不会包含标题那行的数据
        # reader是一个迭代器,遍历这个迭代器,返回来的是一个字典。
        reader = csv.DictReader(fp)
        for x in reader:
            # 以字段名而不是下标获取字典值更实用
            value = {'English': x['英语'], 'Math': x['数学']}
            print(value)


read_csv_demo2()

#保存.npy文件
sc1=np.random.randint(0,10,size=(2,3))
np.save("sc1",sc1)
#读取.npy文件
sc2=np.load("sc1.npy")
print(sc2)
三、写入csv 文件代码(实战版)
import numpy as np

def write_csv_demo1():
    headers = ['name', 'age', 'weight']
    values = [
        ('张三', 18, 180),
        ('李四', 19, 190),
        ('王五', 20, 160)
    ]

    with open('class.csv', 'w', encoding='utf-8', newline='')as fp:
        # newline默认是换行符
        writer = csv.writer(fp)
        writer.writerow(headers)
        writer.writerows(values)


# write_csv_demo1()


def write_csv_demo2():
    headers = ['name', 'age', 'weight']
    values = [
        {'name': '张三', 'age': 18, 'weight': 180},
        {'name': '李四', 'age': 19, 'weight': 190},
        {'name': '王五', 'age': 20, 'weight': 160},
    ]

    with open('class.csv', 'w', encoding='utf-8', newline='')as fp:
        writer = csv.DictWriter(fp, headers)
        # 写入表头数据的时候,需要调用writeheader方法
        writer.writeheader()
        writer.writerows(values)


write_csv_demo2()

四、NANinf

NAN:Not a number ,不是一个数字的意思,但是属于浮点型

特点np.NAN!=np.NAN

​ NAN 和任何值运算结果都是NAN

作用:有些文档会出现缺失值,会影响数据的处理。因此我们删除缺失值或者用其他值填充来 处理缺失值

inf:Infinity,无穷大,也是浮点型

特点:np.inf 表示正无穷大,-np.inf 表示负无穷大,比如2/0

五、删除缺失值
import numpy as np

# 要想删除缺失值,只要提取出不为NAN的值即可
a = np.random.randint(0, 10, size=(3, 5))
print(a)
# [[1 4 8 5 8]
#  [5 5 6 9 2]
#  [7 0 5 9 1]]


a = a.astype(np.float16)
a[0, 1] = np.NAN
print(a)
# [[ 1. nan  8.  5.  8.]
#  [ 5.  5.  6.  9.  2.]
#  [ 7.  0.  5.  9.  1.]]

print(a / 0)
# [[inf nan inf inf inf]
#  [inf inf inf inf inf]
#  [inf nan inf inf inf]]


# print(np.NAN == np.NAN)
# False
a[1, 2] = np.NAN
print(a)
# [[ 1. nan  8.  5.  8.]
#  [ 5.  5.  nan.  9.  2.]
#  [ 7.  0.  5.  9.  1.]]

print(a[~np.isnan(a)])
# [1. 8.  5.  8. 5.  5.  9.  2. 7.  0.  5.  9.  1.]
# 把a中不是nan的元素挑选出来,并重新组成一个一维数组

lines = np.where(np.isnan(a))  # 获取哪些行有NAN
np.delete(a, lines, axis=0)  # 删除有NAN的行
# 除了delete用axis=0表示行以外,其他的大部分函数都是axis=1来表示行。
#  [ 7.  0.  5.  9.  1.]

六、random
import numpy as np

# np.random.seed 用于指定随机数生成时所用算法的开始值,若使用相同的seed()值,则每次生成的随机数都相同

np.random.seed(1)
a = np.random.randint(0, 10, size=(2, 3))
print(a)
print("=" * 30)

np.random.seed(1)
b = np.random.randint(0, 10, size=(2, 3))
c = np.random.randint(0, 10, size=(2, 3))
print(b)
print("=" * 30)

# 随机数种子只对临近的下一次随机数的产生有影响
print(c)
print("=" * 30)

# np.random.rand生成0~1之间的随机数组
d = np.random.rand(2, 3, 4)  # 生成2块,3行,4列的数组,值在0-1之间
print(d)
# [[[0.41919451 0.6852195  0.20445225 0.87811744]
#   [0.02738759 0.67046751 0.4173048  0.55868983]
#   [0.14038694 0.19810149 0.80074457 0.96826158]]
#
#  [[0.31342418 0.69232262 0.87638915 0.89460666]
#   [0.08504421 0.03905478 0.16983042 0.8781425 ]
#   [0.09834683 0.42110763 0.95788953 0.53316528]]]

# np.random.randn 生成均值(μ)为0,标准差(σ)为1的标准正态分布的值
e = np.random.randn()
print(e)
# -1.1006191772129212


# np.random.choice 从列表或者数组中随机取样,取样个数由参数确定
f = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result1 = np.random.choice(f, size=(2, 3))  # 从f中随机采样,生成2行3列的数组
result2 = np.random.choice(f, 3)  # 从f中随机采样3个数据形成一个一维数组
result3 = np.random.choice(10, 3)  # 从0-10之间随机取3个值形成一个一维数组

# np.random.shuffle 把原来数组的元素的位置打乱
g = np.arange(10)
np.random.shuffle(g)
print(g)
# [0 2 7 9 4 5 3 1 6 8]

七、axis

前面为了方便大家理解,将axis=0代表行,将axis=1代表列

这里将带领大家深入理解axis

先上一张图
在这里插入图片描述

如图所示,最外面括号代表0,越往里层axis就依次加1,下面就来实际操作一下

import numpy as np

a = np.arange(0, 4).reshape(2, 2)
print(a)
# [[0 1]
#  [2 3]]
print(a.sum(axis=0))
# 对axis=0里面的元素进行操作,即分别对axis=1里面的相对应的各个元素进行操作
# [2 4]

print(a.sum(axis=1))
# 对axis=1里面的元素进行操作
# [1 5]

b = np.arange(12).reshape(2, 6)
print(b)
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]]
print(b.max(axis=1))
# [ 5 11]
print(b.max(axis=0))
# [ 6  7  8  9 10 11]

# 直接删除在axis=0下下标为0的子元素
print(np.delete(b, 0, axis=0))
# [[ 6  7  8  9 10 11]]
八、常用函数
  • 一元函数
    函数描述
    np.abs绝对值
    np.sqrt开根
    np.square平方
    np.exp计算指数(e^x)
    np.log,np.log10,np.log2,np.log1p求以e为底,以10为低,以2为低,以(1+x)为底的对数
    np.sign将数组中的值标签化,大于0的变成1,等于0的变成0,小于0的变成-1
    np.ceil朝着无穷大的方向取整,比如5.1会变成6,-6.3会变成-6
    np.floor朝着负无穷大方向取证,比如5.1会变成5,-6.3会变成-7
    np.rint,np.round返回四舍五入后的值
    np.modf将整数和小数分隔开来形成两个数组
    np.isnan判断是否是nan
    np.isinf判断是否是inf
    np.cos,np.cosh,np.sin,np.sinh,np.tan,np.tanh三角函数
    np.arccos,np.arcsin,np.arctan反三角函数
  • 二元函数
    函数描述
    np.add加法运算(即1+1=2),相当于+
    np.subtract减法运算(即3-2=1),相当于-
    np.negative负数运算(即-2),相当于加个负号
    np.multiply乘法运算(即23=6),相当于
    np.divide除法运算(即3/2=1.5),相当于/
    np.floor_divide取整运算,相当于//
    np.mod取余运算,相当于%
    greater,greater_equal,less,less_equal,equal,not_equal>,>=,<,<=,=,!=的函数表达式
    logical_and&的函数表达式
    logical_or\的函数表达式
  • 常用聚合函数
    import numpy as np
    
    np.random.seed(1)
    a = np.random.uniform(-10, 10, size=(3, 5))
    print(a)
    # [[-1.65955991  4.40648987 -9.9977125  -3.95334855 -7.06488218]
    #  [-8.1532281  -6.27479577 -3.08878546 -2.06465052  0.77633468]
    #  [-1.61610971  3.70439001 -5.91095501  7.56234873 -9.45224814]]
    
    # 1.sum 计算元素的和
    print(np.sum(a, axis=0))
    # [-11.42889772   1.8360841  -18.99745297   1.54434967 -15.74079564]
    
    # 2.prod	计算元素的积
    print(np.prod(a, axis=0))
    # [ -21.86720956 -102.42573175 -182.53495434   61.72603134   51.8428687 ]
    
    # 3.mean计算元素平均值
    print(np.mean(a, axis=0))
    # [-3.80963257  0.61202803 -6.33248432  0.51478322 -5.24693188]
    
    # 4.std	计算元素的标准差
    print(np.std(a, axis=0))
    # [3.07143708 4.87814805 2.8362632  5.04267983 4.36918635]
    
    # 5.min计算元素最小值
    # argmin找出最小值的索引
    print(np.min(a, axis=0))
    print(np.argmin(a, axis=0))
    # [-8.1532281  -6.27479577 -9.9977125  -3.95334855 -9.45224814]
    # [1 1 0 0 2]
    
    # 6.median计算元素的中位数
    print(np.median(a))
    # -3.0887854591390447
    
    
  • 常用布尔判断函数
    import numpy as np
    
    np.random.seed(1)
    a = np.random.uniform(-10, 10, size=(3, 5))
    print(a)
    # [[-1.65955991  4.40648987 -9.9977125  -3.95334855 -7.06488218]
    #  [-8.1532281  -6.27479577 -3.08878546 -2.06465052  0.77633468]
    #  [-1.61610971  3.70439001 -5.91095501  7.56234873 -9.45224814]]
    
    
    # 1.np.any 	验证存在一个元素是否为真
    b = np.arange(0, 10)
    print(b)
    print(b.any())
    # True
    print((a >= 0).any())
    # True
    # np.sort:指定轴进行排序。默认是使用数组的最后一个轴进行排序。
    print(np.sort(a, axis=0))
    # [[-8.1532281  -6.27479577 -9.9977125  -3.95334855 -9.45224814]
    #  [-1.65955991  3.70439001 -5.91095501 -2.06465052 -7.06488218]
    #  [-1.61610971  4.40648987 -3.08878546  7.56234873  0.77633468]]
    
    b = np.random.randint(0, 10, size=(3, 5))
    print(b)
    #
    # [[2 4 7 7 9]
    #  [1 7 0 6 9]
    #  [9 7 6 9 1]]
    
    
    b.sort()
    # 这个方法会直接影响到原来的数组,而不是返回一个新的排序后的数组。
    # 但是sort(a,axis=0)不同
    print(b)
    # [[2 4 7 7 9]
    #  [0 1 6 7 9]
    #  [1 6 7 9 9]]
    
    
    print(a)
    # [[-1.65955991  4.40648987 -9.9977125  -3.95334855 -7.06488218]
    #  [-8.1532281  -6.27479577 -3.08878546 -2.06465052  0.77633468]
    #  [-1.61610971  3.70439001 -5.91095501  7.56234873 -9.45224814]]
    print(np.argsort(a, axis=0))  # 返回排序的下标
    # [[1 1 0 0 2]
    #  [0 2 2 1 0]
    #  [2 0 1 2 1]]
    
    
    # 降序排序1:np.sort默认会采用升序排序,若想要采用降序排序,则,
    print(-np.sort(-a))
    # [[ 4.40648987 -1.65955991 -3.95334855 -7.06488218 -9.9977125 ]
    #  [ 0.77633468 -2.06465052 -3.08878546 -6.27479577 -8.1532281 ]
    #  [ 7.56234873  3.70439001 -1.61610971 -5.91095501 -9.45224814]]
    # 降序排序2:使用sort和argsort以及take
    indexes = np.argsort(-a)  # 排序后的结果就是降序的
    print(np.take(a, indexes))  # 从a中根据下标提取相应的元素
    
    
  • 其他函数补充
    import numpy as np
    
    # 1. apply_along_axis:沿着某个轴执行指定的函数
    np.random.seed(1)
    c = np.random.randint(0, 100, size=(3, 20))
    print(c)
    
    # [[37 12 72  9 75  5 79 64 16  1 76 71  6 25 50 20 18 84 11 28]
    #  [29 14 50 68 87 87 94 96 86 13  9  7 63 61 22 57  1  0 60 81]
    #  [ 8 88 13 47 72 30 71  3 70 21 49 57  3 68 24 43 76 26 52 80]]
    
    
    # 求数组a按行求均值,并且要去掉最大值和最小值
    # def get_mean(x):
    #     y = x[np.logical_and(x != x.max(), x != x.min())].mean()
    #     return y
    # print(get_mean(c))
    # 43.94827586206897
    b = np.apply_along_axis(lambda x: x[np.logical_and(x != x.max(), x != x.min())].mean(), axis=0, arr=c)
    print(b)
    # [29. 14. 50. 47. 75. 30. 79. 64. 70. 13. 49. 57.  6. 61. 24. 43. 18. 26.
    #  52. 80.]
    
    # 2.np.linspace:用来将指定区间内的值平均分成多少份
    d = np.linspace(0, 1, 10)  # 从0-1平均分成10份
    print(d)
    # [0.         0.11111111 0.22222222 0.33333333 0.44444444 0.55555556
    #  0.66666667 0.77777778 0.88888889 1.        ]
    

    写在最后:

    ​ 本人是大学学生一枚,若文中出现错误,欢迎莅临指正!这两篇文章是我看某站上《清华大佬终于把Python数据分析讲完了!从入门到精通保姆级教程》即兴而写,历时2天。

    创作不易,还望各位大侠们一键三连~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值