导入numpy库。
import numpy as np
使用np.array([1,2,3,4,5])创建一个数组;数组中的参数是初始化一维数据,以列表来表示。
np.array([1,2,3,4,5]) # 创建数组
array([1, 2, 3, 4, 5])
使用np.zeros((3,2))来创建一个全为零的数组;参数用元祖(3,2)来表示数组的尺寸,即3行2列。
np.zeros((3,2)) # 3行2列 全为0的数组
array([[0., 0.],
[0., 0.],
[0., 0.]])
Numpy中的数组可以是一维、二维或者更高维度。
a=np.zeros((3,2))
a.shape # shape获取数组的尺寸
(3, 2)
np.ones((2,4)) # 2行4列 全为1的 二维数组
array([[1., 1., 1., 1.],
[1., 1., 1., 1.]])
使用arange()创建递增数列和递减数列,参数写法和range()类似。
np.arange(1,10) # 1-9递增的数列
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(30,6,-3)
array([30, 27, 24, 21, 18, 15, 12, 9])
30是起始值,终值不超过6,而-3是步长。
使用np.linspace(0,4,12)创建介于0到4之间等距离分布的12个数的数组。
0~4是区间范围,12是输出样本的总数。
np.linspace(0,4,12)
array([0. , 0.36363636, 0.72727273, 1.09090909, 1.45454545,
1.81818182, 2.18181818, 2.54545455, 2.90909091, 3.27272727,
3.63636364, 4. ])
通过np.random.rand(3,5)生成一个3行5列的数值在0~1之间的随机数组。
np.random.rand(3,5)
array([[0.67862159, 0.12482976, 0.32949449, 0.66781721, 0.61244637],
[0.05901743, 0.20008822, 0.12040259, 0.28459513, 0.8051357 ],
[0.93619322, 0.37511957, 0.54599208, 0.85768786, 0.42316584]])
数组默认的数据类型是64位浮点数。
a=np.random.rand(3,5)
a.dtype
dtype('float64')
b=np.linspace(0,4,12)
b.dtype
dtype('float64')
c=np.zeros((3,2))
c.dtype
dtype('float64')
当然也有例外。
d=np.arange(30,6,-3)
d.dtype
dtype('int32')
我们也可以在创建数组时使用dtype()指定其类型。
a=np.zeros((3,2),dtype=np.int32)
a.dtype
dtype('int32')
参数 | 数据类型 |
---|---|
np.int8/16/32/64 | 整型 |
np.uint8/16/64 | 无符号整型 |
np.float32/64 | 浮点数 |
Bool | 布尔数据类型(True或者False) |
str | 字符串 |
complex64/128 | 复数 |
… | … |
对于已有的数组可以通过astype转换其数据类型。
这里将数组中的两个浮点数转换成整数,即直接舍去小数部分。
a=np.array([
[6.3,9,16],
[12.3,28,29],
[25,6,48]])
b=a.astype(int)
b
array([[ 6, 9, 16],
[12, 28, 29],
[25, 6, 48]])
也可将列表里的字符转换为整数类型。
vector=np.array(['6','9','12','21'])
vector=vector.astype(int)
vector
array([ 6, 9, 12, 21])
在numpy中可以轻松地对数组完成基本的数学逻辑运算。
a=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
b=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
a+b
array([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18]])
a=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
b=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
a/b
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
将两个向量点乘运算,这是线性代数里的两个矩阵相乘的含义。
要求第一个矩阵的列与第二个矩阵的行相同。
a=np.array([
[1,2,3],
[4,5,6],
])
b=np.array([
[7,8],
[9,10],
[11,12]
])
np.dot(a,b)
array([[ 58, 64],
[139, 154]])
另一个与点乘相关的是@乘,它与np.dot()的含义一样。
a=np.array([
[1,2,3],
[4,5,6],
])
b=np.array([
[7,8],
[9,10],
[11,12]
])
a@b
array([[ 58, 64],
[139, 154]])
numpy中还可以使用sqrt()将对所有的数据元素依次求取平方根。
a=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
np.sqrt(a)
array([[1. , 1.41421356, 1.73205081],
[2. , 2.23606798, 2.44948974],
[2.64575131, 2.82842712, 3. ]])
np.sin(a)对a取正弦值,a可以是单个数据,也可以是数组,np.cos(a)同理。
a=np.pi
b=np.array([0,np.pi/2,np.pi])
print(np.sin(a),np.sin(b))
print(np.cos(a),np.cos(b))
1.2246467991473532e-16 [0.0000000e+00 1.0000000e+00 1.2246468e-16]
-1.0 [ 1.000000e+00 6.123234e-17 -1.000000e+00]
其中,np.pi表示 π \pi π,但是它并不能完全精确于 π \pi π,因此计算机计算出sin(np.pi)不是准确的0,而是无限接近于01 。
使用np.exp(x)表示 e e e的 x x x次方,即 e x e^x ex。
a=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
print(np.exp(1))
print(np.exp(a))
2.718281828459045
[[2.71828183e+00 7.38905610e+00 2.00855369e+01]
[5.45981500e+01 1.48413159e+02 4.03428793e+02]
[1.09663316e+03 2.98095799e+03 8.10308393e+03]]
a=np.array([[1,2,3],
[4,5,6]])
print(np.log(np.exp(1)))
print(np.log(a))
1.0
[[0. 0.69314718 1.09861229]
[1.38629436 1.60943791 1.79175947]]
a=np.array([[1,2,3],
[4,5,6]])
np.power(a,3)
array([[ 1, 8, 27],
[ 64, 125, 216]], dtype=int32)
其中power(a,3)表示对每一个数值求立方。
可以直接将一个数组与单独的一个数做运算。
numpy会分别计算每一个元素与这个数的乘积,相当于给这个数乘了一个系数。
本例中的每一个数都扩大了10倍。
a=np.array([[1,2,3],
[4,5,6]])
a*10
array([[10, 20, 30],
[40, 50, 60]])
如果两个矩阵尺寸不同,在运算之前会将两个数组扩展至相同的尺寸,这种操作在numpy里称作广播(Broadcast)2,然后将相同位置的元素相加。
a=np.array([[1],
[2],
[3]])
b=np.array([7,8,9])
a+b
array([[ 8, 9, 10],
[ 9, 10, 11],
[10, 11, 12]])
其中,矩阵a由 ( 1 2 3 ) \left( \begin{smallmatrix} 1 &\\ 2 & \\ 3 & \end{smallmatrix} \right) (123)扩展为 ( 1 1 1 2 2 2 3 3 3 ) \bigl( \begin{smallmatrix} 1 & 1 & 1 \\ 2 & 2 & 2 \\ 3 & 3 & 3 \end{smallmatrix} \bigr) (123123123),矩阵b由 ( 7 8 9 ) \bigl( \begin{smallmatrix} 7 & 8 & 9 \\ \end{smallmatrix} \bigr) (789)扩展为 ( 7 8 9 7 8 9 7 8 9 ) \left( \begin{smallmatrix} 7 & 8 & 9 \\ 7 & 8 & 9 \\ 7 & 8 & 9 \end{smallmatrix} \right) (777888999)。
我们可以通过min和max返回数组中最小或者最大元素的值,
a=np.array([[1,2,3],
[4,5,6]])
a.max()
6
a=np.array([[1,2,3],
[4,5,6]])
a.min()
1
而使用argmax和argmin返回数组中最大值和最小值所在的位置。
由于地址空间是线性的,所以即使是多维数组,其实也是线性存储,即一维排列。
本例中的二维数组先存第一行1 2 3, 再存第二行4 5 6, 而6所在的这个位置,索引是从0开始,因此6的索引的下标就为5。
a=np.array([[1,2,3],
[4,5,6]])
a.argmax()
5
a=np.array([[1,2,3],
[4,5,6]])
a.argmin()
0
sum返回所有数据的总和。
a=np.array([[1,2,3],
[4,5,6]])
a.sum()
21
如果是多维数组:
加上axis=0会按行求和;
a=np.array([[1,2,3],
[4,5,6]])
a.sum(axis=0)
array([5, 7, 9])
加上axis=1会按列求和。
a=np.array([[1,2,3],
[4,5,6]])
a.sum(axis=1)
array([ 6, 15])
因为axis=0表示多维数组中的第1维度,而axis=1表示多维数组中的第2维度。
mean返回数据的平均值。
a=np.array([[1,2,3],
[4,5,6]])
a.mean()
3.5
median返回数据的中位数。
a=np.array([[1,2,3],
[4,5,6]])
np.median(a)
3.5
var用来计算数据的方差。
a=np.array([[1,2,3],
[4,5,6]])
a.var()
2.9166666666666665
std用来计算数据的标准方差。
a=np.array([[1,2,3],
[4,5,6]])
a.std()
1.707825127659933
获取数组的部分数据,即切片,其语法与Python中的list非常相似。
比如你想获取某个单个数据,a[0,1]表示取出下标为0 1的元素2。
a=np.array([[1,2,3],
[4,5,6]])
a[0,1]
2
下面这个例子当中使用了0:2这种切片的语法,0:2代表可以取出[0,2]这个区间但不包括2,这与Python中的list的切片方式完全一样。
a=np.array([[1,2,3],
[4,5,6]])
a[0,0:2]
array([1, 2])
想要获取第0行的所有元素使用 a[0,:],第一个参数表示是第1行,第二个参数是列,但它只有一个冒号,冒号表示,列从开始到结束,即第一行的全部列。
a=np.array([[1,2,3],
[4,5,6]])
a[0,:]
array([1, 2, 3])
此外,也可以直接写成a[0],即为二维数组的第1行的全部。
a=np.array([[1,2,3],
[4,5,6]])
a[0]
array([1, 2, 3])
如果是三个冒号,则有点类似于range的三个参数,从下标为0到下标为7;第三个参数表示一个跨度。
当跨度为2时,每隔两个数据取一个;
a=np.array([1,2,3,4,5,6,7,8,9])
a[0:8:2]
array([1, 3, 5, 7])
当跨度为3时,每隔三个数取一个。
a=np.array([1,2,3,4,5,6,7,8,9])
a[0:8:3]
array([1, 4, 7])
这个跨度还可以取负数,下面这个例子取的是-1,从右向左逆向筛选,即从8到0前面的那个数,即下标为1的2。
a=np.array([1,2,3,4,5,6,7,8,9])
a[8:0:-1]
array([9, 8, 7, 6, 5, 4, 3, 2])
最后一个写法的行和列全部都省略了,即为全部数据。
-1为逆向筛选,它的作用就是将数组翻转、逆序。
a=np.array([1,2,3,4,5,6,7,8,9])
a[::-1]
array([9, 8, 7, 6, 5, 4, 3, 2, 1])
另外我们还可以通过条件筛选出指定的元素。
例如我们在方括号里输入a<5,则返回所有小于5的元素。
a=np.array([[1,2,3],
[4,5,6]])
a[a<5]
array([1, 2, 3, 4])
也可以通过逻辑运算符表达式组合出不同的条件。
&表示逻辑运算并且。
a=np.array([[1,2,3],
[4,5,6]])
a[(a>2)&(a%2==0)]
array([4, 6])
这个例子筛选出返回大于2的所有的偶数。
|表示逻辑运算符或者。
a=np.array([[1,2,3],
[4,5,6]])
a[(a>=5)|(a<=2)]
array([1, 2, 5, 6])
这个例子筛选出大于等于5或者小于等于2的数据。
np.sin( )函数 (Numpy库) ↩︎
Python/Numpy中的矩阵向量的广播(Broadcasting)特性 ↩︎