1.安装
# numpy直接使用pip进行安装,numpy版本更新较快也较容易和其他包版本冲突
pip install numpy
2 基础信息
import numpy as np
print (np.__version__)
print(np.show_config())
2.1 创建np数据
Z = np.zeros(10) # 1维长度10
Z = np.zeros((10,10))
Z = np.arange(50)
Z = Z[::-1]
Z = np.arange(9).reshape(3,3) # 改变形状
Z = np.nonzero([1,2,0,0,4,0]) # 得到非零元素位置
Z = np.eye(3)
Z = np.diag(1+np.arange(4) # 创建对角阵
Z = np.random.random((3,3,3))
Z.min(), Z.max(),Z.mean() # 获得最大值、最小值、均值
Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0) # 边界填充
Z = np.zeros((8,8),dtype=int)
Z[1::2,::2] = 1
Z[::2,1::2] = 1 # 棋盘格数组
Z = np.tile( np.array([[0,1],[1,0]]), (4,4)) # 棋盘格数组
np.transpose(x, (2, 0, 1)) #转换通道顺序
2.2 数组计算
Z1 = np.random.randint(0, 10, 10)
Z2 = np.random.randint(0, 10, 10)
print (np.intersect1d(Z1, Z2)) # 求公共元素
# 查看np信息
np.Inf # 正无穷数
eval("3") # 3 输出为3
print(test1.ndim) # 2
print(test1.shape) #(2, 3)
print(test1.size) # 6
# 指定形式
np.array([1,2,3],dtype=np.float) # array([1., 2., 3.])
2.3 零一矩阵,空矩阵
np.zeros((3,4))
np.ones((3,4))
np.empty((3,4))
2.4生成范围数
## 在reshap成矩阵 np.linspace中6代表数量
np.arange(1,13,2).reshape((2,3))
np.linspace(1,11,6).reshape((2,3))
2.5 矩阵计算
# +-*类似
g = np.array([5, 6,7,8])
h= np.arange(4)
i = g*h #+-*方式相同,array([ 0, 6, 14, 24])
j = 10 * np.sin(h)
print(g<7) # [ True True False False]
#矩阵点乘
g = g.reshape((2,2))
h = h.reshape((2,2))
np.dot(g,h)
2.6 最大值、和、行方向的最大值
k = np.random.random((2,4)) # 两行四列1之内的随机数
print(np.max(k)) # 0.9727591906394822
print(np.sum(k)) # 2.918453689744127
print(np.max(k, axis=0)) # 同一列取最大值,[0.26896094 0.09978274 0.97275919 0.6045273 ]
2.7 最大值位置,均值中位数,行差,转置和排序
l = np.arange(2,14).reshape((3,4))
print(np.argmin(l)) # 0
print(np.argmax(l)) # 11
print(np.mean(l)) # 7.5
print(np.average(l))# 7.5
print(np.median(l)) # 中位数
print(np.cumsum(l)) # 前每个数叠加 [ 2 5 9 14 20 27 35 44 54 65 77 90]
print(np.diff(l)) # 行的相邻差 [[1 1 1] [1 1 1] [1 1 1]]
print(np.nonzero(l))# (array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2]), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3])) 代表非零元素位置,前面是行的位置后面是列的位置
print(np.sort(l)) # 逐行排序
print(l.T) # 转置
print(np.transpose(l))# 转置可以指定维度间的变换
print(np.clip(l, 5,9)) # 截取中间的数将小于的数变成5大于的数变成9,中间不变
2.8 取值
print(l[0][1])
print(l[1,2])
print(l[1, 1:3])
for row in l: # 输出行
print(row)
for column in l.T: # 输出行
print(column)
print(l.flatten()) # 展平成一维数据,
for item in l.flat:# 去除里面的所有元素值
print(item)
2.9 矩阵的堆叠
A = np.array([1,2,3])
B = np.array([2,3,4])
print(np.vstack((A,B))) # 行堆叠
A = np.array([1,2,3])[:, np.newaxis] #[:,np.newaxis] (3, 1)
B = np.array([2,3,4])[:, np.newaxis] #[np.newaxis,:] (1,,3)
print(np.hstack((A,B))) # 列方向堆叠
print(np.concatenate((A,B,A),axis = 1)) # 多个堆叠可指定行列
2.10矩阵的分割
print(np.split(l, 2,axis=1)) # 分割成两列
print(np.array_split(l, 3,axis=1)) # 不等分割
print(np.vsplit(l, 3)) # hsplit同理
2.11矩阵的复制
a = np.arange(4)
b = a
d = b # 改变a,b,d 都会变
b = a.copy() # 此时a改变不会改变b
b.tolist() # 将矩阵转成列表
plt.figure()
plt.plot(np.array(history)[:,0])
plt.plot(np.array(history)[:,1])
plt.show()
2.12 增加图像维度
image = np.expand_dims(image,axis=0)
np.transpose(x, (2, 0, 1)) #转换通道顺序
2.13 画出图像直线
# 通过hoghlines得到的直线数据集
for line in rec_path:
rho = line[0] # 第一个元素是距离rho
theta = line[1] # 第二个元素是角度theta
print(rho, theta)
if (theta < (np.pi / 4.)) or (theta > (3. * np.pi / 4.0)): # 垂直直线
pt1 = (int(rho / np.cos(theta)), 0) # 该直线与第一行的交点
# 该直线与最后一行的焦点
pt2 = (int((rho - data.shape[0] * np.sin(theta)) / np.cos(theta)), data.shape[0])
cv2.line(data, pt1, pt2, (255),5) # 绘制一条白线
else: # 水平直线
pt1 = (0, int(rho / np.sin(theta))) # 该直线与第一列的交点
# 该直线与最后一列的交点
pt2 = (data.shape[1], int((rho - data.shape[1] * np.cos(theta)) / np.sin(theta)))
cv2.line(data, pt1, pt2, (255), 5) # 绘制一条直线
后续操作在实际使用过程中会逐渐更新。