numpy学习

创建数组

import numpy as np
a = np.array([1,2,3,4,5])
b = np.array(range(1,6))
c = np.arange(1,6)
print(a)
print(b)
print(c)

image
上面3个做法创建的都是同一个数组。

数组的类名和数据的类型:

a = np.array([1,2,3])
print(type(a)) # 类名
print(a.dtype) # 数据的类型

image

一些常见的数据类型:
image

创建指定数据类型的数组:

a = np.array([1,0,1,0],dtype='?')
print(a)

image

修改数据类型:

a = np.array([1,0,1,0],dtype='?')
print(a)
a = a.astype("i2") # astype返回一个array,不会影响对象本身
print(a.dtype)
print(a)

image

保留固定位小数:

b = np.array([0.114514,0.1919810])
print(b)
print(np.round(b,2))

image

数组的形状

a = np.array([[1,1,4,5,1,4],[1,9,1,9,9,1]])
print(a)
print(a.shape) # 查看a的形状
b = a.reshape(3,4) # 改变a的形状
print(b)

image

转化成一维数组:

a = np.array([[1,1,4,5,1,4],[1,9,1,9,9,1]])

print(a.reshape(1,12))# 错误做法

print(a.flatten()) # 正确做法

image

数组和数的计算

a = np.array([[1,1,4,5,1,4],
             [1,9,1,9,9,1]])
print(a+1)
print(a*3)

运算的广播机制,作用于所有元素
image

a = np.array([[1,1,4,5,1,4],
             [1,9,1,9,9,1]])
b = np.array([[1,1,4,5,1,4],
             [1,9,1,9,9,1]])
print(a+b) # 一一对应相加
print(a*b) # 一一对应相乘

image

广播原则

image
比如说这样是不行的:

import numpy as np
a = np.array([[1,1,4,5,1,4],
             [1,9,1,9,9,1]])
b = np.array([[1,1,4,5,1,4],
             [1,9,1,9,9,1],
             [1,9,1,9,9,1]])
print(a*b)

image

image

这样又行了(其中一方的长度为1):

import numpy as np
a = np.array([1,1,4,5,1,4]) # (1,6),其实这里是一维的,应该是(6,)
b = np.array([[1,1,4,5,1,4],
             [1,9,1,9,9,1],
             [1,9,1,9,9,1]])
print(a+b)
print(a*b)

image

axis轴

在numpy中可以理解为方向,使用0,1,2...数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴
image
image

numpy读取本地数据

image

import as np

path = "xxxxxx.csv" # 假设读了一个csv

t1 = np.loadtxt(path,delimiter=',',dtype='int',unpack=True) # 需要知道文件以什么符号为分割符(假设','分隔),unpack=True相当于矩阵转置

image

这些方法都可以实现转置。

索引和切片

import numpy as np
a = np.array([[1,1,4,5,1,4],
             [1,9,1,9,9,1],
             [1,9,1,9,9,1]])

print(a[1]) # 取1行
print(a[1:3]) # 切片(左闭右开)
print(a[0:3:2]) # 加上步长

print(a[:,2]) # 取下标为2的列
print(a[:,2:4]) # 切片

print(a[0:2,2:4]) # 也是可以用a[[0,2],[2,4]]来取,

image

如果要选定某些行或者某些列切片:

a[:,[2,4]] # 前面必须加冒号,选列24
print(a[[0,1,2],:]) # 选择012行

image

筛选出值小于x的数据

import numpy as np
a = np.array([[1,1,4,5,1,4],
             [1,9,1,9,9,1],
             [1,9,1,9,9,1]])
print(a<5)
print(a[a<8])
b = a
b[b<8] = 0 # 筛选赋值
print(b)

c = np.where(a<5,2,3) # 三元运算符,小于5的全部赋值2,否则3
print(a)
print(c)

d = a.clip(3,6) # 把小于3的赋值为3,大于6的赋值为6
print(d)

image

image

image

numpy中的nan

nan和inf是float类型,并且nan!=nan

a=np.inf
print(type(a))
a=np.nan
print(type(a))

print(np.nan==np.nan)

image

image

image
那么问题来了,在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?

比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行

常用统计函数

axis参数表示对哪一个轴方向求结果。
image

一些其他操作

拼接数组(shape得合法,否则会报错):

a = np.array([[1,1,4,5,1,4],
             [1,9,1,9,9,1],
             [1,9,1,9,9,1]])
b = np.array([[1,1,4,5,1,4],
             [1,9,1,9,9,1],
             [1,9,1,9,9,1]])
print(np.vstack((a,b))) # 竖直拼接
print(np.hstack((a,b))) # 水平拼接

image

image

交换行列:

a = np.array([[1,1,4,5,1,4],
             [1,9,1,9,9,1],
             [1,9,1,9,9,1]])
#交换行
a[[0,2]] = a[[2,0]]
print(a)

#交换列
a[:,[0,2]] = a[:,[2,0]]
print(a)

image
image

image

image

image

posted @ 2021-08-20 11:40  Lecoww  阅读(35)  评论(0)    收藏  举报