安装
使用conda安装(前提是下载好了conda)
在cmd中操作
conda install numpy
使用
1.numpy可以将列表轻松转化为数组,并得到数组维度,行列数,元素个数
numpy的数组并不能单纯的理解为矩阵。数组可以是多维的,但矩阵只能是二维的。
>>> import numpy as np
>>> array = np.array([[1,2,3],[4,5,6]])
>>> print (array)
[[1 2 3]
[4 5 6]]
>>> #维度
>>> array.ndim
2
>>> #行列数
>>> array.shape
(2, 3)
>>> #元素个数
>>> array.size
6
2.使用numpy创建各种array
numpy数组和多维列表的区别是,numpy数组各元素没有逗号分割,但多维列表有逗号分割
numpy的数组(array)可以使用dtype设置/查看元素类型
可以为int/int64, int32 ,float/float64, float32等
>>> array = np.array([[1,2,3],[4,5,6]],dtype=np.int32)
>>> array.dtype
dtype('int32')
使用np.zeros(([rows],[columns]))快速定义零数组
>>> zeros = np.zeros((4,4))
>>> print(zeros)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
使用np.ones(([rows],[columns]))快速定义1数组
>>> ones = np.ones((2,3),dtype = np.int32)
>>> print(ones)
[[1 1 1]
[1 1 1]]
使用np.arange([start],[end],[step]).reshape([rows],[columns])快速定义有序数组
>>> order = np.arange(2,22,2)
>>> print(order)
[ 2 4 6 8 10 12 14 16 18 20]
>>> order = np.arange(1,9).reshape((3,3))
>>> print(order)
[[1 2 3]
[4 5 6]
[7 8 9]]
使用np.linspace([start],[end],[num])生成等差数列,也可以说是一维数组.
num为数列个数。注意该方法中生成的数列范围是闭区间[start,end],前面的方法范围都是开区间[start,end)。
>>> array = np.linspace(0,6,6)
>>> print(array)
[0. 1.2 2.4 3.6 4.8 6. ]
使用.reshape([rows],[columns])改造成多维数组
>>> array = np.linspace(0,6,6).reshape(2,3)
>>> print(array)
[[0. 1.2 2.4]
[3.6 4.8 6. ]]
3.基础运算
1.创建两个数组a,b
>>> import numpy as np
>>> a = np.arange(5)
>>> b = np.arange(1,6)
>>> print(a)
[0 1 2 3 4]
>>> print(b)
[1 2 3 4 5]
2.可以进行加减乘除运算等
注意,乘运算并不是矩阵中的乘运算
>>> a+b
array([1, 3, 5, 7, 9])
>>> a*b
array([ 0, 2, 6, 12, 20])
>>> a**2 #a平方运算
array([ 0, 1, 4, 9, 16], dtype=int32)
>>> 10*np.tan(a)
array([ 0. , 15.57407725, -21.85039863, -1.42546543,
11.57821282])
3.判断a矩阵中各值是否大于5
>>> print(a>5)
[False False False False False]
4.矩阵乘法 np.dot
先创建两个2*2的数组
>>> a = np.array([[1,1],[2,3]])
>>> b = np.array([[1,3],[2,4]])
>>> print(a)
[[1 1]
[2 3]]
>>> print(b)
[[1 3]
[2 4]]
对比数组乘和矩阵乘
>>> a*b #数组乘
array([[ 1, 3],
[ 4, 12]])
>>> np.dot(a,b) #矩阵乘
array([[ 3, 7],
[ 8, 18]])
当a,b都是一维数组时,也可以进行矩阵运算,默认前者是1n矩阵,后者是n1矩阵,结果是一个数值
>>> a
array([0, 1, 2, 3, 4])
>>> b
array([1, 2, 3, 4, 5])
>>> np.dot(a,b)
40
5.随机生成数组
>>> array = 3*np.random.random((3,3))
>>> print(array)
[[2.71220122 1.09777029 1.1203321 ]
[1.1594069 1.10064526 2.50962161]
[0.69297843 1.39163243 2.59530941]]
6.求数组和/最值
>>> print(np.sum(array ))
14.379897648265743
>>> print(np.min(array ))
0.6929784312092455
可以对各行(axis =1)或各列(axis = 0)求和/最值
axis指的是轴,对于二维数组,axis = 0横轴,axis=1对应纵轴
对于一维数组,只有一个横轴axis=0
很多方法都可以指定axis这个参数
>>> print(np.min(array ,axis = 0))
[0.69297843 1.09777029 1.1203321 ]
>>> print(np.min(array ,axis = 1))
[1.09777029 1.10064526 0.69297843]
7.求平均值,中位数
>>> a = np.arange(14,8,-1).reshape((2,3))
>>> print(a)
[[14 13 12]
[11 10 9]]
>>> np.average(a)
11.5
>>> np.median(a)
11.5
8.累加/后项减前项差
>>> print(a)
[[14 13 12]
[11 10 9]]
>>> b = np.cumsum(a)
>>> c = np.diff(a)
>>> print(b)
[14 27 39 50 60 69] #第n个数是前n项的和
>>> print(c)
[[-1 -1] #a2-a1 = c1,以此类推
[-1 -1]]
9.排序
>>> A = np.array([2,28,1,13,9])
>>> np.sort(A)
array([ 1, 2, 9, 13, 28])
10.矩阵的转置
以下三种写法是等价的
>>> print(a)
[[14 13 12]
[11 10 9]]
>>> a.T
>>> a.transpose()
>>> np.transpose(a)
array([[14, 11],
[13, 10],
[12, 9]])
a.transpose()和np.transpose(a)是等价的,同样的,max,min,sort等方法也可以这样等价
注意,一维数组不能成功转置
>>> print(a)
[1 1 1]
>>> a.T
array([1, 1, 1])
11.clip方法:给定一个范围[a,b],超出范围的数值将被替换为a或b
>>> print(a)
[[14 13 12]
[11 10 9]]
>>> a.clip(10,13)
array([[13, 13, 12],
[11, 10, 10]])
4.索引
设有如下a数组
>> print(a)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
1.输出指定元素
>>> a[2][3] #2行3列
11
>>> a[2,3] #2行3列
11
>>> a[2] #2行
array([ 8, 9, 10, 11])
>>> a[:,2] #2列
array([ 2, 6, 10])
>>> a[2,0:2] #2行 0至2列元素
array([8, 9])
2.迭代输出元素
>>> print(a)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
迭代输出行
>>> for row in a:
... print("--",row)
...
-- [0 1 2 3]
-- [4 5 6 7]
-- [ 8 9 10 11]
迭代输出列
>>> for column in a.T:
... print("--",column)
...
-- [0 4 8]
-- [1 5 9]
-- [ 2 6 10]
-- [ 3 7 11]
迭代输出各元素
>>> a.flatten()
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> for item in a.flat:
... print(item,end = ",")
...
0,1,2,3,4,5,6,7,8,9,10,11,
5.合并
1.合并两个数组 :纵向合并vstack(vertical stack) / 水平合并hstack(horizontal stack)
>>> a = np.array([1,1,1])
>>> b = np.array([2,2,2])
>>> np.vstack((a,b))
array([[1, 1, 1],
[2, 2, 2]])
>>> np.hstack((a,b))
array([1, 1, 1, 2, 2, 2])
一维数组进行合并时,先转化成二维数组再合并,若合并结果是一维的,会恢复到一维。
2.还可以用concatenate合并,若参数axis = 0,等价于hstack,若axis = 1,等价于vstack
3.之前提到一维数组不能使用.T转置,那么怎么将一维数组进行转置呢
方法就是为它增加一个维度,使其变成二维数组
>>> a = np.array([1,1,1])
>>> print(a)
[1 1 1]
>>> d = np.array([1,1,1])[:,np.newaxis]
>>> print(d)
[[1]
[1]
[1]]
6.分割
在字符串中,split函数可以对字符串进行分割
>>> a,b,c=input("请输入三个字符,用逗号分割").split(",")
请输入三个字符,用逗号分割1,2,3
>>> print(a,b,c)
1 2 3
1.在numpy数组中使用np.split()进行等量分割,参数axis = 0表示横向切分,axis = 1表示纵向切分
若要分割一维数组,仅能纵向切分,且axis 只能为 0(一维数组只有一个轴)
>>> a = np.array([[1,2,3], [4,5,6]])
>>> print(a)
[[1 2 3]
[4 5 6]]
>>> b = np.split(a,2,axis = 0)
>>> for item in b:
··· print(item)
[[1 2 3]]
[[4 5 6]]
可以看出,二维数组分割后一定是二维的,一维数组分割后一定是一维的
2.使用array_split()进行不等量分割
>>> a = np.arange(12)
>>> a = np.array_split(a,5,axis = 0)
>>> print(a)
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7]), array([8, 9]), array([10, 11])]
7.copy&deep copy
对于numpy的两个数组a和b
copy:b = a a和b用于指向同一对象
deep copy:b = a.copy() a和b并非指向同一对象