numpy基础

1.为什么要学习numpy?

-> 快速

-> 方便

-> 科学计算的基础库

2.什么是numpy?

一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算。

3. 如何在python中使用numpy?

import numpy as np

ndarray 多维数组(N Dimension Array)

NumPy数组是一个多维的数组对象(矩阵),称为ndarray,具有矢量算术运算能力和复杂的广播能力,并具有执行速度快和节省空间的特点。

ndarray拥有的属性

-> ndim属性:维度个数

-> shape属性:维度大小

-> dtype属性:数据类型

numpy生成随机数

# 导入numpy,别名np

import numpy as np

# 生成指定维度大小(3行4列)的随机多维浮点型数据(二维),rand固定区间0.0 ~ 1.0

arr = np.random.rand(3, 4)

print(arr)

print(type(arr))

# 生成指定维度大小(3行4列)的随机多维整型数据(二维),randint()可以指定区间(-1, 5)

arr = np.random.randint(-1, 5, size = (3, 4)) # 'size='可省略

print(arr)

print(type(arr))

# 生成指定维度大小(3行4列)的随机多维浮点型数据(二维),uniform()可以指定区间(-1, 5)

arr = np.random.uniform(-1, 5, size = (3, 4)) # 'size='可省略

print(arr)

print(type(arr))

print('维度个数: ', arr.ndim)

print('维度大小: ', arr.shape)

print('数据类型: ', arr.dtype)

numpy生成序列

1. np.array(collection) 和 np.arange( )

以下 a,b,c内容相同

a = np.array([1,2,3,4])

b = np.array(range(1,5))

c = np.arange(1,5)

2.np.zeros()

指定大小的全0数组。注意:第一个参数是元组,用来指定大小,如(3, 4)。

np.zeros((3,4))

3. np.ones()

指定大小的全1数组。注意:第一个参数是元组,用来指定大小,如(3, 4)。

np.ones((3,4))

4.np.random.shuffle() 和 reshape()

random.shuffle() 将打乱数组序列(类似于洗牌)。

arr = np.arange(15).reshape(3,5)

print(arr)

np.random.shuffle(arr)

print(arr)

ndarray的数据类型

1. dtype参数

指定数组的数据类型,类型名+位数,如float64, int32

2. astype方法

转换数组的数据类型

# 初始化3行4列数组,数据类型为float64

a = np.zeros((3, 4), dtype=np.float64)

print(a.dtype)

# astype转换数据类型,将已有的数组的数据类型转换为int32

a_int = a.astype(np.int32)

print(a_int.dtype)

ndarray的矩阵运算

1. 矢量运算:相同大小的数组间运算应用在元素上

# 矢量与矢量运算

arr = np.array([[1, 2, 3],

[4, 5, 6]])

print("元素相乘:")

print(arr * arr)

print("矩阵相加:")

print(arr + arr)

2. 矢量和标量运算:“广播” - 将标量"广播"到各个元素

# 矢量与标量运算

print(1. / arr)

print(2. * arr)

print(arr + 1)

3.矢量和矢量运算:广播原则

举个例子,也就是说,

shape为(3,3,3)的数组能够和(3,2)的数组,进行计算么?

No.

shape为(3,3,2)的数组能够和(3,2)的数组进行计算么?

Yes.

a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]]) # 2行6列

b = np.array([1,2,3,4,5,6]) # 1行6列

print(a - b)

print(a * b)

ndarray的索引与切片

1. 一维数组的索引与切片

与Python的列表索引功能相似

# 一维数组

arr1 = np.arange(10)

print(arr1)

print(arr1[2:5])

运行结果:

[0 1 2 3 4 5 6 7 8 9]

[2 3 4]

2. 多维数组的索引与切片:

3. numpy中数值的修改

4. 条件索引

把t中小于10的数字替换为0t[t<10] = 0

2.把t中小于10的数字替换为0,把大于10的替换为10

np.where(t<10,0,10) #利用三元运算符

3. 小于10的替换为10,大于18的替换为18

t.clip(10,18)

numpy中的转置

可通过以下三种方法进行转置操作:

a. transpose()

a.T

a.swapaxes(1,0)

numpy中的nan和inf

1.nan(NAN,Nan):not a number表示不是一个数字

什么时候numpy中会出现nan:

当我们读取本地的文件为float的时候,如果有缺失,就会出现nan

当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)

2.inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷

什么时候回出现inf包括(-inf,+inf)

比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)

3.那么如何指定一个nan或者inf呢?

注意他们的type类型 : nan 或 inf 为 float类型

np.nan != np.nan 利用这个特性,我们可以通过 np.count_nonzero(t != t)来统计数组中nan的个数

ndarry缺失值填充均值

for i in range(t.shape[1]):

nan_num = np.count_nonzero(t[:,i] != t[:i]) # 计算nan的个数

if nan_num > 0:

col_sum = t[:,i][np.isnan(t[:,i]) == False].sum() # 求和

col_mean = col_sum / (t.shape[0] - nan_num) #求每一列的均值

t[:,i][np.isnan(t[:,i])] = col_mean #替换

数组的拼接

数组水平或者竖直拼接很简单,但是拼接之前应该注意什么?

竖直拼接的时候:每一列代表的意义相同!!!否则牛头不对马嘴

如果每一列的意义不同,这个时候应该交换某一组的数的列,让其和另外一类相同

那么问题来了?

如何交换某个数组的行或者列呢?

数组的行列交换

numpy中更多好用的方法

1.获取最大值最小值的位置

np.argmax(t,axis=0)

np.argmin(t,axis=1)

2.求和,平均值

np.mean(arr)

np.sum(arr)

3.求最大值,最小值

np.max(arr)

np.min(arr)

3.求标准差,方差

np.std()

np.var()

4.多维数组默认统计全部维度,axis参数可以按指定轴心统计,值为0则按列统计,值为1则按行统计。

arr = np.arange(12).reshape(3,4)

print(arr)

print(np.sum(arr, axis=0)) # 数组的按列统计和

print(np.sum(arr, axis=1)) # 数组的按行统计和

5.判断函数

np.any(): 至少有一个元素满足指定条件,返回True

np.all(): 所有的元素满足指定条件,返回True

arr = np.random.randn(2,3)

print(arr)

print(np.any(arr > 0))

print(np.all(arr > 0))

运行结果:

[[ 0.05075769 -1.31919688 -1.80636984]

[-1.29317016 -1.3336612 -0.19316432]]

True

False

6.元素去重排序函数

np.unique():找到唯一值并返回排序结果,类似于Python的set集合

arr = np.array([[1, 2, 1], [2, 3, 4]])

print(arr)

print(np.unique(arr))

运行结果:

[[1 2 1]

[2 3 4]]

[1 2 3 4]

numpy读取数据

np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)