Numpy是python中科学计算的基础包,提供多维数组对象,各种派生对象,以及用数组快速操作的各种API,在机器学习中,Numpy也较为重要,因此学习Numpy很有必要的。
具体的内容可以去官网看文档Numpy官方文档
Numpy有着矢量化和广播的功能基础。
矢量化描述了代码中没有任何显式的循环,索引等 - 这些当然是预编译的C代码中“幕后”优化的结果。矢量化代码有许多优点,其中包括:
1.矢量化代码更简洁,更易于阅读
2.更少的代码行通常意味着更少的错误
3.代码更接近于标准的数学符号(通常,更容易正确编码数学结构)
4.矢量化导致产生更多 “Pythonic” 代码。如果没有矢量化,我们的代码就会被低效且难以阅读的for循环所困扰。
广播是用于描述操作的隐式逐元素行为的术语; 一般来说,在NumPy中,所有操作,不仅仅是算术运算,而是逻辑,位,功能等,都以这种隐式的逐元素方式表现,即它们进行广播。此外,在上面的例子中,a并且b可以是相同形状的多维数组,或者标量和数组,或者甚至是具有不同形状的两个数组,条件是较小的数组可以“扩展”到更大的形状。结果广播明确无误的方式。
在使用之前,我们先把Numpy包下载并导入
pip install numpy
下面是一些方法,如果有的参数不懂可以使用help函数进行解决
print(help(np.array()))
'''我们习惯性的将numpy简写为np'''
import numpy as np
# 做一个简单的矩阵模型
array = np.array([[1, 2, 3],
[2, 3, 4]])
print(array)
print('number of dim:', array.ndim)# 返回维度
print('shape:', array.shape)# 返回形状
print('size:', array.size)# 返回元素数
b = np.array([2, 3, 1], dtype=np.int64)# 修改形式
print(b.dtype)
c = np.zeros((3, 4))
print(c)
d = np.empty((3, 4))
print(d)
# 上面两个都是创建0矩阵
# 创建1矩阵
e = np.ones((3,4))
print(e)
e = np.arange(10, 20, 2)
# 最后一个参数为步长
print(e)
# 我们仍然可以改变它的形状
f = np.arange(12).reshape((3, 4))
print(f)
# numpy还支持分割数字的方法来创建矩阵
g = np.linspace(1, 10, 5)# 把数字分成5份
print(g)
h = np.linspace(1, 10, 6).reshape((2, 3))
print(h)
a = np.random.random((2, 4))
基本内容到这就结束了,如果了解更多可以使用help函数或者查看官方文档
'''我们要知道,对于numpy矩阵进行整体运算时实际上就是对每一个变量进行运算'''
# 首先我们先定义两个同型矩阵变量
a = np.array([10, 20, 30, 40])
b = np.arange(4)
# 我们可以让他们进行简单的加减乘除运算,对应位置发生运算
c = a - b
d = b**2
print(c)
print(d)
[10 19 28 37]
[0 1 4 9]
e = 10*np.sin(a)
print(e)
[-5.44021111 9.12945251 -9.88031624 7.4511316 ]
print(b<3)
[ True True True False]
a = np.array([[1, 1], [0, 1]])
b = np.arange(4).reshape((2, 2))
print(a, '\n', b)
c = a*b# 每个分量相乘
cDot2 = a.dot(b)# 我们所熟悉的矩阵乘法
print(c, '\n', cDot2)
[[1 1]
[0 1]]
[[0 1]
[2 3]]
[[0 1]
[0 3]]
[[2 4]
[2 3]]
'''
求和np.sum()
最值np.min()
利用axis=1可求每一行,=0每一列
'''
A = np.arange(2, 14).reshape(3, 4)
print(A)
print(np.argmin(A))# 打印最小值的索引,最大值相似
print(np.mean(A))# 计算平均值
print(np.average(A))# 计算平均值
print(np.median(A))# 中位数
print(np.cumsum(A))# 逐个累加
print(np.diff(A))# 逐减
print(np.nonzero(A))# 返回非零数的坐标,两者分开了
print(np.sort(A))#排序,逐行排序
print(np.transpose(A))# 矩阵的转置
print(np.clip(A, 5, 10))# 我们统一矩阵,小于五的变成五,大于10的变成10,中间的不变
# 可以修改axis进行行列计算
numpy创建的数组同样支持索引和切片,由于是多维数组在操作上可能有些不同
a = np.arange(3, 15)
print(a)
print(a[3])
print(a[1:2])
[ 3 4 5 6 7 8 9 10 11 12 13 14]
6
[4]
A = np.arange(3, 15).reshape(3, 4)
print(A[2][1])
# 对于二维数组的切片可以有两个参数,第一个参数是选择的行,第二个是列
print(A[:,2])
print(A[1, 1:2])
12
[ 5 9 13]
[8]
for column in A.T:# 转置
print(column)
print(A.flatten())# 变成一行
for item in A.flat:
print(item)
numpy中提供了split函数进行分割
A = np.arange(12).reshape((3, 4))
print(A)
print(np.split(A, 2, axis=1))#横向分割
print(np.split(A, 3, axis=0))# 纵向分割
'''用上面的两个函数时要注意分割均等,但是如果不知道他的形状怎么办?
下面的函数支持不均等的分割
'''
print(np.array_split(A, 3, axis=1))
# 对于分割,我们可以用下面的函数直接对行或列进行分割不必进行参数设置
print(np.vsplit(A, 3))#纵向
print(np.hsplit(A, 2))# 横向
A = np.array([1, 1, 1])
B = np.array([2, 2, 2])
print(np.vstack((A, B)))# 竖直合并
print(np.hstack((A, B)))# 水平合并
# 还有一个函数np.newaxis
'''对于[: , np.newaxis] 和 [np.newaxis,:]
是在np.newaxis这里增加1维。'''
print(A[:, np.newaxis])#列加了一个维度
A = A[:, np.newaxis]
B = B[:, np.newaxis]
C = np.concatenate((A, A, B), axis=1)# 合并时可以选择维度
print(C)
在numpy中如果我们直接进行赋值使得两个矩阵相同,那么他们的变化就会相关联,如果不希望如此,我们可以用a.copy的方法进行复制
import numpy as np
a = np.arange(4)
b = a
c = a
d = b
a[0] = 11
# 此时他们都会发生改变
# 如果不想关联可以使用这个方法
b= a.copy()
numpy的基本内容就是这些了,如果有一些地方错误的话欢迎大家指正。