一、numpy简介
numpy是一个在Python中做科学计算的基础库。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算。
优点:快捷,方便
二、Ndarray对象
NumPy 中定义的最重要的对象是称为 ndarray
的 N 维数组类型。ndarray中的每个元素在内存中使用相同大小的块, ndarray
中的每个元素是数据类型对象的对象(称为 dtype
)
三、numpy创建数组
1、首先需要导入numpy
import numpy as np
2、接着创建数组
import numpy as np
a = np.array([1,2,3,4])
b = np.arange(1,5)
#arange用法:arange([start,] stop[, step,],dtype=None)
a,b输出结果:
[1,2,3,4]
3、数组类名
import numpy as np
a = np.array([1,2,3,4])
print(type(a))
#输出:
numpy.ndarray
4、数据的类型(可以自己设,也astype修改)
import numpy as np
a = np.array([1,2,3,4])
print(a.dtype)
#输出:
int32
import numpy as np
a = np.array([1,2,3,4]).astype("int64")
print(a.dtype)
a = np.array([1,2,3,4],dtype="int64")
#输出:
int64
5、设置维度(ndmin)
import numpy as np
a = np.array([1,2,3,4],ndmin=1).astype("int64")
补充:更多numpy中常见的数据类型
四、数组的形状
简单来说就是数组由几行几列构成,例如(a,b)表示a行b列的一个数组,.shape可以查看形状,输出形式为元组
import numpy as np
a = np.array([[1,2,3,4],
[5,6,7,8]])
print(a.shape)
#输出:
(2,4)
.reshape可以修改形状,特别地,若想展开为一维数组,可用.flatten(),不需要传入行数或者列数
import numpy as np
a = np.array([[1,2,3,4],
[5,6,7,8]]).reshape((4,2))
print(a)
print(a.shape)
print(a.flatten())
#输出:
[[1 2]
[3 4]
[5 6]
[7 8]]
(4, 2)
[1 2 3 4 5 6 7 8]
应用:在数组特别大或者想要单独取行或列进行运算时,可以通过shape指定进行行或列的选中,例如后续将nan替换为平均值或中值时,需要指定计算某行或某列的平均值或中值,此时,.shape[0]表示选中行,.shape[1]表示选中列。
*注意:axis表示轴,对于二维数组,axis=0表示行,axis=1表示列,
对于三维数组,有0,1,2轴,axis=0表示块,axis=1表示行,axis=2表示列
五、数组和数组/数的计算(广播机制)
广播机制:如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符或其中一方 的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
在计算上,简单来说,就是当数组与数相加,或者数组与另一个行或列能够对应数组相加时,所有数字都会进行运算。具体理解见下例
1、数组与数的计算
import numpy as np
a = np.array([[1,2,3,4],
[5,6,7,8]])
b = a+3
print(b)
c = a*3
print(c)
#输出:
b : [[ 4 5 6 7]
[ 8 9 10 11]]
c : [[ 3 6 9 12]
[15 18 21 24]]
数字会与数组里的每一个数进行运算
2、数组与数组的计算
import numpy as np
a = np.array([[1,2,3,4],
[5,6,7,8]])
b = np.array([[1],
[2]])
ans1 = a+b
print(ans1)
ans2 = a*b
print(ans2)
#输出:
[[ 2 3 4 5]
[ 7 8 9 10]]
[[ 1 2 3 4]
[10 12 14 16]]
数组的对应位置会进行运算,但若位置不对应就会报错
import numpy as np
a = np.array([[1,2,3,4],
[5,6,7,8]])
b = np.array([[1],
[2],
[3]])
ans1 = a+b
print(ans1)
#输出:
Traceback (most recent call last):
File "---------------", line 184, in <module>
ans1 = a+b
~^~
ValueError: operands could not be broadcast together with shapes (2,4) (3,1)
六、numpy读取数据
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
参数 | 解释 |
frame | 文件、字符串或产生器,可以是.gz或bz2压缩文件 |
dtype | 数据类型,可选,CSV的字符串以什么数据类型读入数组中,默认np.float |
delimiter | 分隔字符串,默认是任何空格,使用时可以改为逗号 |
skiprows | 跳过前n行,一般跳过第一行表头 |
usecols | 读取指定的列,索引,元组类型 |
unpack | 如果True,读入属性将分别写入不同数组变量,False读入数据只写入一个数组变量,默认False |
*注意:unpack默认为False(0),也就是数据怎样,导入就是怎样
若为True(1)原数据的行变成列,列变成行,也就是转置
转置
在对角线防线交换数据,目的是为了更好处理数据
1).transpose()
import numpy as np
a = np.array([[1,2,3,3,2,1],
[5,6,7,7,6,5],
[8,9,0,0,9,8]])
print(a)
print(a.transpose())
#输出:
[[1 2 3 3 2 1]
[5 6 7 7 6 5]
[8 9 0 0 9 8]]
[[1 5 8]
[2 6 9]
[3 7 0]
[3 7 0]
[2 6 9]
[1 5 8]]
2).swapaxes(1,0)(二维数组时)
import numpy as np
a = np.array([[1,2,3,3,2,1],
[5,6,7,7,6,5],
[8,9,0,0,9,8]])
print(a)
print(a.swapaxes(1,0))
#输出:
[[1 2 3 3 2 1]
[5 6 7 7 6 5]
[8 9 0 0 9 8]]
[[1 5 8]
[2 6 9]
[3 7 0]
[3 7 0]
[2 6 9]
[1 5 8]]
3).T
import numpy as np
a = np.array([[1,2,3,3,2,1],
[5,6,7,7,6,5],
[8,9,0,0,9,8]])
print(a)
print(a.T)
#输出:
[[1 2 3 3 2 1]
[5 6 7 7 6 5]
[8 9 0 0 9 8]]
[[1 5 8]
[2 6 9]
[3 7 0]
[3 7 0]
[2 6 9]
[1 5 8]]
以上方法均可实现转置,效果相同
七、numpy的索引和切片
1、取一行或一列
import numpy as np
a = np.arange(12).reshape((3,4))
a[1] #表示取第二行
a[:,2]表示取第三列
2、取多行或多列
import numpy as np
a = np.arange(12).reshape((3,4))
a[1:3] #表示取第二行到第四行的所有值
a[:,2:4] #表示取第三到第五列的所有值
*注:若要修改某个值,直接向索引的目标赋值即可:a[:,2,4] = 0
3、布尔索引
常用于进行修改numpy中的某些符合条件的值
a[a<5] = 0 #表示将a中小于5的值全部修改为0
4、numpy中的三元运算符
用where完成
np.where(a<5,0,5) #表示将小于5的修改为0,大于5的修改为5
5、numpy中的clip
a.clip(5,10) #表示将小于5的替换为5,大于10的替换为10,其他不变
*注意:clip无法将nan与inf进行修改
八、numpy中的nan与inf
nan:(not a number)表示不是数字,例如读取文件的确实或做了不合适运算
inf:(infinity)表示无穷,例如某个数字除以0时会出现
*注:nan与inf均为float类型
nan
1)两个nan是不相等的,也就是np.nan!=np.nan
2)利用1)可以判断nan的个数,具体代码如下
np.count_nonzero(a!=a)
3)通过判断是不是nan,并将其返回bool类型,实现nan的替换
a[np.isnan(a)] = 0 #将所有nan替换为0
**注:一般不将nan替换为0而是均值或者中值
九、numpy中常用的统计函数
求和 | a.sum(axis = None) |
均值 | a.mean(axis = None) |
中值 | np.median(a,axis = None) |
最大值 | a.max() |
最小值 | a.min() |
极值 | np,ptp(a,axis = None) |
标准差 | a.std(axis = None) |
补充说明:均值
import numpy as np
a = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
print(a.mean())
print(a.mean(axis = 0))
print(a.mean(axis = 1))
#输出:
5.0
[4. 5. 6.]
[2. 5. 8.]
十、数组的拼接
1、竖直拼接:np.vstack
import numpy as np
a = np.array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
b = np.array([[12,13,14, 15,16,17],
[18,19,20,21,22, 23]])
print(np.vstack((a,b)))
#输出:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
2、水平拼接
import numpy as np
a = np.array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
b = np.array([[12,13,14, 15,16,17],
[18,19,20,21,22, 23]])
print(np.hstack((a,b)))
#输出:
[[ 0 1 2 3 4 5 12 13 14 15 16 17]
[ 6 7 8 9 10 11 18 19 20 21 22 23]]
十一、更多
1、创建一个全0的数组: np.zeros((4,6))
2、创建一个全1的数组: np.ones((2,4))
3、创建一个对角线为1的正方形数组(方阵):np.eye(5)