NumPy基础学习笔记
简介
NumPy是主要面向数值计算的Python语言的扩展程序库。
NumPy数据类型
NumPy数据类型比Python更加丰富,并且他是基于矩阵进行的,首先使用numpy.array
对输入的数据进行转化。
import numpy as np
a = np.array([[9,2,3],
[2,3,4]])
print(a)
print('number of dim:',a.ndim) #输出数组维度
print('shape:',a.shape) #输出行数多少,列数多少
print('size:',a.size) #输出总共的元素是多少
得到输出结果是没有逗号分隔的列表,这也是array的概念:
[[9 2 3]
[2 3 4]]
number of dim: 2
shape: (2, 3)
size: 6
我们也可以使用一定的代码指定数值类型和数组参数。比如:dtype
指定数组,astype
转换数组类型。
import numpy as np
a=np.array([2,28,25],dtype=np.int32)
print(a,a.dtype) #查看a及type类型
输出结果为:
[ 2 28 25] int32
NumPy数组类型
NumPy最核心且重要的一个特性是ndarray
多维数组对象,用有对高维数组的处理能力,是数值计算中很重要的特性。ndarrray
具有六个参数,分别是:
-
shape
-
dtype
-
buffer
-
offset
-
strides
-
order
NumPy基本运算
矩阵array
的加减法:
import numpy as np
a=np.array([10,20,30,40])
b=np.arange(4)
print(a,b)
c=a-b
print(c)
输出结果为:
[10 20 30 40] [0 1 2 3]
[10 19 28 37]
乘法中平方要用两个**
乘号,三角函数等需要额外调用函数表示:
import numpy as np
a=np.array([10,20,30,40])
b=np.arange(4)
print(a,b)
c=10*np.sin(a)
print(c)
输出结果为:
[10 20 30 40] [0 1 2 3]
[-5.44021111 9.12945251 -9.88031624 7.4511316 ]
简单的判断输出:
加上print(c>0)
之类的即可,输出为False
或者True
运行矩阵的乘法:
import numpy as np
a=np.array([[1,1],
[0,1]])
b=np.arange(4).reshape((2,2)) #定义
c=a*b
c_dot=np.dot(a,b) #另一个形式是a.dot(b),也是矩阵a和b相乘
print(a)
print(c_dot)
结果为:
[[1 1]
[0 1]]
[[2 4]
[2 3]]
生成随机矩阵,然后输出最大最小值等:还可以定义在固定的行和列中求和,如在第一行中求和等numpy.sum(a,axis=1)
。
import numpy as np
a=np.random.random((2,4))
print(a)
print(np.sum(a))
print(np.max(a))
print(np.min(a))
输出结果为:
[[0.59158093 0.90361177 0.897047 0.61164592]
[0.52997834 0.83121234 0.64046197 0.39272447]]
5.398262738075469
0.9036117685336776
0.39272447025501467
NumPy的索引
矩阵最大值最小值的索引:
import numpy as np
A=np.arange(14,2,-1).reshape((3,4))
print(A)
print(np.mean(A))#平均值
print(np.mean(A,aixs=1))#对于行计算平均数
print(np.argmin(A))#最小值
print(np.argmax(A))#最大值
print(np.median(A))#中位数
print(np.cumsum(A))#累加
print(np.diff(A))#累差
print(np.nonzero(A))#非零数
print(np.sort(A))#逐行排序
print((A.T).dot(A))#转置
print(np.clip(A,5,9))#截断,不能显示小于5或者大于9的
索引并输出具体位置的元素:
import numpy as np
A=np.arange(3,15).reshape((3,4))
print(A)
print(A[1][1])#索引第一行第一列,注意行和列数都从0开始计数
print(A[1,1])#另一种表达形式
print(A[2,:])#索引第二行的所有数
print(A[:,2])#索引第二列的所有数
print(A[2,1:3])#索引第二行第一列到第三列,包含第一列,不包含第三列
import numpy as np
A=np.arange(3,15).reshape((3,4))
print(A)
for row in A:
print(row)#输出行
for column in A.T:#转置A
print(column)#输出行,就是原本的列
print(A.flatten())
for item in A.flat:#迭代每一个项目使用flat,形成一个迭代器,把三行四列的矩阵迭代成一个一个的项
print(item)
NumPy的array合并
vstack
上下合并,hstack
左右合并,另外横向转为纵向合并需要多一些步骤。
import numpy as np
A=np.array([1,1,1])
B=np.array([2,2,2])
C=np.vstack((A,B))#vstack上下合并,变成一个数列
print(C)
D=np.hstack((A,B))#hstack左右合并,变成一个数列
print(D)
print(A.shape,C.shape,D.shape)
输出结果为:
[[1 1 1]
[2 2 2]]
[1 1 1 2 2 2]
(3,) (2, 3) (6,)
NumPy的array分割
注意:在分割的时候只使用split
不能进行不等量的分割,但可以使用numpy.array_split
。
import numpy as np
A=np.arange(12).reshape((3,4))
print(A)
print(np.split(A,2,axis=1))#2代表两块,axis代表对列进行操作
print(np.array_split(A,3,axis=1))
输出结果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
另外,有一个更为简化的函数
import numpy as np
A=np.arange(12).reshape((3,4))
print(np.vsplit(A,3))#纵向分割为3块
print(np.hsplit(A,2))#横向分割为2块
输出结果为:
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
NumPy的赋值和deep copy
赋值例如:
import numpy as np
a=np.arange(4)
b=a
c=a
print(b)
a[1:3]=[22,33]
print(c)
输出结果为:
[0 1 2 3]
[ 0 22 33 3]
如果想要b对于a赋值之后的值,但是不想关联a,可以使用deep copy的功能。
import numpy as np
a=np.arange(4)
a[1:3]=[22,33]
b=a.copy()#deep copy
print(b)
a[3]=44
print(b)
输出结果为:
[ 0 22 33 3]
[ 0 22 33 3]
尾声
numpy先学这么多吧,虽然我慢吞吞,但是加油加油加油。