安装

使用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并非指向同一对象