Numpy入门常用运算(一)

Numpy基础知识

首先安装Numpy包,pip install numpy,另外如果之前使用过Matplotlib包,应该已经自动安装了Numpy包

创建数组

import numpy as np
import random

# 第一种创建方式
t1 = np.array([1,2,3,4])
print(t1)
print(type(t1))
# 第二种创建方式
t2 = np.array(range(10))
print(t2)
# 第三中创建方式
t3 = np.arange(10)
print(t3)
print(t3.dtype)

# 指定创建数组的类型
t4 = np.arange(10,dtype='float32')
print(t4)
print(t4.dtype)

t5 = np.array([1.2,3.4,5.6],dtype='float32')
print(t5)
print(t5.dtype)

# '?'表示bool类型
t6 = np.array([1,1,0,1,0,0,1],dtype='?')
print(t6)
print(t6.dtype)


# 修改原有的数据类型使用astype
t7 = t6.astype('int16')
print(t7)
print(t7.dtype)


# 保留两位小数1
t8 = np.array(['%.2f'%random.random() for i in range(10)],dtype='float16')
print(t8)
# 保留两位小数2
t8 = np.array([round(random.random(),2) for i in range(10)],dtype='float16')
print(t8)
#保留两位小数3
t9 = np.array([random.random() for i in range(10)],dtype='float32')
t9 = np.round(t9,2)
print(t9)

# nan是float类型的数据

numpy常用方法

import numpy as np
# linalg专门用于矩阵运算
import numpy.linalg as la
import random

# 查看一维数组的shape
t1 = np.array(range(12))
print(t1.shape)

# 二维数组的shape
t2 = np.array([[1,2,3],[4,5,6]])
print(t2.shape)

# 三维数组的shape
t3 = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
print(str(t3.shape)+'hahaha')

# reshape方法重构数组的形状或维度
t4 = np.array(range(24))
t4 = t4.reshape((3,2,4))
print(t4)

# shape是一个元组,可以用以下方式重构
t5 = t4.reshape((t4.shape[0]*t4.shape[1]),t4.shape[2])
print(t5)

# flatten函数将原来的shape转换为一维的数组
t6 = t5.flatten()
print(t6)

# ndarray直接加一个数,则数组中每个数都加上该数
t7 = t5+3
print(t7)

# 每个数都乘
print(t6*2)

# 每个数都除0,若(非0)/0,则结果为inf表示无穷大,若0/0则结果为nan,表示不是一个数字
print(t6/0)

# 同型数组对应数字相加
t8 = np.array(range(50,74)).reshape((6,4))
print(t8+t5)

# shape(m,n)和shape(n,)或者shape(m,)都可以进行运算,每行或每列对应相减
t9 = np.array(range(0,4))
print(t8-t9)
t10 = np.array(range(6)).reshape((6,1))
print(t8)
print(t8-t10)


# shape(3,3,2) 和 shape(3,3)不能运算,满足从后向前匹配的原则
# t11 = np.array(range(200,204)).reshape((2,2))
# print(t3-t11)

print('@-'*50)
t11 = np.array(range(1,26)).reshape((5,5))
print(t11)
# 输出相关系数矩阵
print(np.corrcoef(t11))
# 输出上三角矩阵       下三角矩阵使用tril
print(np.triu(t11))
# 矩阵对角线,输出后为一维ndarray类型
print(np.diag(t11))
# 矩阵的转置,具体有三种方法
# 一维数组的转置仍然是一维数组,不会变
print(np.transpose(t11))
print(t11.T)
print(t11.swapaxes(0,1))

# 计算矩阵的迹
print(np.trace(t11))

# repeat()方法创建矩阵,将3重复4次
t12 = np.repeat(3,4)
print(t12)

# linspace()产生等差数列
t13 = np.linspace(1,9,5)        # 产生从1--9共5个数字的等差数列
print(t13)

# 求矩阵的行列式,求行列式必须为方阵
t14 = np.array([random.randint(1,5) for i in range(16)]).reshape((4,4))
print(la.det(t14))

# 求逆矩阵
print(la.inv(t14))

# 特征值的分解
print(la.eig(t14))

# 奇异值的分解
print(la.svd(t14))

# 数组求和
print(t14.sum())
# 按列求和
print(t14.sum(axis=0))
# 按行求和
print(t14.sum(axis=1))

# 数组求乘积
print(t14.prod())		#数组中所有数一起乘
# 按列求乘积
print(t14.prod(axis=0))
# 按行求乘积
print(t14.prod(axis=1))

# max(),min()求最大最小值、
# 默认对整个数组求最值
# 设置axis属性为0时,对列求最值
# axis为1时,对行求最值

# 求方差var和标准差std
print(t14.var())
print(t14.var(axis=0))
print(t14.var(axis=1))
print(t14.std())
print(t14.std(axis=0))
print(t14.std(axis=1))

# 求平均数
print(t14.mean())

# 对数组每个元素开方
print(np.sqrt(t14))

# 对每个元素求平方
print(np.square(t14))

# 以e为底的指数次方
print(np.exp(t14))

# 计算每个元素的对数
print(np.log10(t14))

# 计算真正的矩阵乘法
print(t8@t14)

numpy读取文件数据

import numpy as np

# 准备csv文件,亲测txt文件也可读
us_file_path = './youtube_video_data/US_video_data_numbers.csv'
uk_file_path = './youtube_video_data/GB_video_data_numbers.csv'

# 读取数据,unpack参数用于矩阵转置
t1 = np.loadtxt(us_file_path,delimiter=',',dtype=int)
t2 = np.loadtxt(us_file_path,delimiter=',',dtype=int,unpack=True)

print(t1)
print(t2)
print(t2.T)

# 要处理什么问题?
# 要用什么呈现方式
# 数据还需要做什么处理
# 编码

# ndarray的切片,取第三行数据
print(t1[2])

# 取多行,第四行之后
print(t1[3:])

# 取不连续的多行,第3,4,11行
print(t1[[2,3,10]])

# 列表测试,列表和ndarray的切片是不同的
# t3 = [[1,2,3],[4,5,6]]
# print(t3[1][1:])

# 逗号前面是行的切片,逗号后面是列的切片
# 行列都切
print(t1[2:,1:])

# 只取一列时,会变成一维的数组
print(t1[:,0])
print(t1[:,0].shape)

# 取多列时仍保持原来的shape,切1,2两列
print(t1[:,[0,1]])
print(t1[:,[0,1]].shape)

# 取不相邻的点
# 取出来的值为[0,0],[1,1],[2,2]
print(t1[[0,1,2],[0,1,2]])

修改数据

import numpy as np

t1 = np.array(range(1,25)).reshape((4,6))
# t1<10输出仍然是ndarray,是一个bool型矩阵
print(t1<10)
# 将矩阵中所有小于10的数据赋值为3
t1[t1<10] = 3
print(t1)

# 修改,将所有小于10的数据设置为0,否则设置为10
t1 = np.where(t1<10,0,10)
print(t1)

# 将小于10的数据改为10,大于20的数据设置为20
t1 = t1.clip(10,20)
print(t1)

# 修改为float类型之后才能赋值为nan,注意修改类型是有返回值的,要接收
t1 = t1.astype(float)
print(t1)
t1[0][0] = np.nan
print(t1)

nan的计数

import numpy as np

# nan和nan是不相等的
print(np.nan == np.nan)

# 统计数组中不为0的个数
t1 = np.arange(1,25).reshape(4,6)
print(t1)
# 将第一列设置为0
t1[:,0] = 0
print(t1)
# 打印0的个数
print(np.count_nonzero(t1))

# 修改为float类型
t1 = t1.astype(float)
print(t1)
# 将[2,3],[3,4]设置为nan
t1[[2,3],[3,4]] = np.nan
print(t1)
# 统计数组中有多少nan,首先t1!=t1会生成bool矩阵,True = 1,即不为0的数
print(np.count_nonzero(t1!=t1))
# 另个一种方式
print(np.count_nonzero(np.isnan(t1)))

nan的替换

在矩阵的运算中,常有一种需求,求矩阵的均值或者方差,而若矩阵中含有nan时,nan和任何值做运算结果都是本身,这样就得不出正确的结果,只有在求均值时将nan替换为其余数字和的均值才能得出正确结果,现演示替换。

import numpy as np

# 替换nan为平均值
def fill_ndarray(t1):
    for i in range(t1.shape[1]):  # 遍历每一列
        temp_i_t1 = t1[:, i]  # 取出第i列数据
        count_nan = np.count_nonzero(temp_i_t1[temp_i_t1 != temp_i_t1])  # 统计该列nan的个数
        if count_nan != 0:  # 说明该列有nan
            temp_not_nan_i = temp_i_t1[temp_i_t1 == temp_i_t1]  # 保存该列非nan的数据
            temp_mean = np.mean(temp_not_nan_i)  # 求该列平均值
            temp_i_t1[temp_i_t1 != temp_i_t1] = temp_mean
            pass
        pass
    return t1


t1 = np.arange(1, 13).reshape((3, 4)).astype(float)
t1[1, 2:] = np.nan
print(t1)

# 注意temp得到的实际上是地址,因次使用temp修改数据时,仍然是对原数组的修改
# print(id(t1[:, 0]))
# temp = t1[:, 0]
# print(id(temp))
# 拷贝要使用
# t2 = t1.copy()            # 这样才会开辟新的内存空间

t1 = fill_ndarray(t1)
print(t1)

ndarray数组拼接&行列交换

在做矩阵运算时,常有需求,采集了两本数据,对应列相同,此时想将两本数据融合为一本,就要用到数组拼接

在做矩阵相加减时,需要对应列的数据是同一类数据,若果有错位,则需要进行行列的交换

import numpy as np

# t1 = np.arange(1,21).reshape((4,5))
# t2 = np.arange(21,37).reshape((4,4))

# 水平拼接,注意传入参数是元组
# t3 = np.hstack((t1,t2))
# print(t3)

# 交换行,实际上就是赋值操作
# t3[2:,:] = t3[1:,:] # 报错,不能把could not broadcast input array from shape (3,9) into shape (2,9)
# t3[[1,2],:] = t3[[2,1],:]
# print(t3)

# 下面以读取到的数据做演示
us_path = './youtube_video_data/US_video_data_numbers.csv'
uk_path = './youtube_video_data/GB_video_data_numbers.csv'

# 读取数据
us_data = np.loadtxt(us_path,delimiter=',',dtype=int)
uk_data = np.loadtxt(uk_path,delimiter=',',dtype=int)

# 创建全0数据
us_mark = np.zeros((us_data.shape[0],1),dtype=int)
uk_mark = np.ones((uk_data.shape[0],1),dtype=int)

# 水平拼接数据
us_data = np.hstack((us_data,us_mark))
uk_data = np.hstack((uk_data,uk_mark))

# 竖直拼接数据
final_data = np.vstack((us_data,uk_data))

print(final_data)

其他有用的方法

import numpy as np

# eye创建单位矩阵
t = np.eye(6)
print(t)

# argmin(),argmax()求最小最大值的位置
print(np.argmax(t,axis=0))
print(np.argmin(t,axis=0))          # 找出第一个最小值

# 生成随机数组
t = np.random.random((3,4))         # 生成shape(3,4)的取值在0--1之间的浮点数
t = np.random.randint(1,6,(4,5))      # 生成1--6之间(包括1不包括6)的shape(4,5)的矩阵
t = np.random.rand(5)                 # 生成服从均匀分布的一维数组,shape(5,)
t = np.random.randn(5)                # 生成服从正态分布的一维数组,shape(5,)
print(t)

# 随机数种子
np.random.seed(5)       # 无论什么时候用,只要种子号是5,都是那几个数
# np.random.seed(4)
t = np.random.randint(5,9,(2,4))
print(t)

猜你喜欢

转载自blog.csdn.net/tiaochewang219/article/details/107379494
今日推荐