Numpy
数据分析:是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律
数据分析三剑客:Numpy,Pandas,Matplotlib
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
一、创建ndarray
1. 使用np.array()创建
import numpy as np
# 一维数据创建
np.array([1,2,3,4,5])
# array([1, 2, 3, 4, 5])
# 二维数组创建
np.array([[1,2,3],[4,5,6]])
# array([[1, 2, 3],
# [4, 5, 6]])
np.array([[1,2,3],[4,'five',6]])
# array([['1', '2', '3'],
# ['4', 'five', '6']], dtype='<U11')
数据中的类型是统一的,全部变为字符串 而列表元素可以放任意类型的数据
内存 列表 对应的内存是不连续开辟的 数组 对应的内存是连续开辟的
np.array([[1,2.2,3],[4,5,6]])
# array([[1. , 2.2, 3. ],
# [4. , 5. , 6. ]])
# 注意:
numpy默认ndarray的所有元素的类型是相同的
如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int
数据中的类型是统一的,全部变为字符串
而列表元素可以放任意类型的数据
内存存放的方式不同造成的
列表 对应的内存是不连续开辟的
数组 对应的内存是连续开辟的
# 使用matplotlib.pyplot获取一个numpy数组,数据来源于一张图片
import numpy as np
import matplotlib.pyplot as plt
img_arr = plt.imread('./cat.jpg') # 表示为三维的数据
# img_arr 结果为三维数据
# 三维数据,前两个数值表示图片的像素,最后的数值表示图片的颜色
array([[[231, 186, 131],
[232, 187, 132],
[233, 188, 133],
...,
[100, 54, 54],
[ 92, 48, 47],
[ 85, 43, 44]],
...,
[188, 98, 64],
[188, 95, 62],
[188, 95, 62]]], dtype=uint8)
# 操作该numpy数据,该操作会同步到图片中
img_arr = plt.imread('./cat.jpg') # 表示为三维的数据
plt.imshow(img_arr)
# <matplotlib.image.AxesImage at 0x1d0e7339978>
# 这里为一张猫的图片
plt.imshow(img_arr - 100)
# <matplotlib.image.AxesImage at 0x1d0e7339978>
# img_arr # 三维数据,前两个数值表示图片的像素,最后的数值表示图片的颜色
2.使用np的routines函数创建
5) np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 等差数列
np.linspace(1,100,num=20)
array([ 1. , 6.21052632, 11.42105263, 16.63157895,
21.84210526, 27.05263158, 32.26315789, 37.47368421,
42.68421053, 47.89473684, 53.10526316, 58.31578947,
63.52631579, 68.73684211, 73.94736842, 79.15789474,
84.36842105, 89.57894737, 94.78947368, 100. ])
6) np.arange([start, ]stop, [step, ]dtype=None) # ste为步伐
np.arange(0,100,step=2)
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32,
34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66,
68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98])
7) np.random.randint(low, high=None, size=None, dtype='l')
np.random.seed(10) #随机因子/时间种子
np.random.randint(0,100,size=(4,5))
# 2行 5列 固定随机数 设置随机因子 np.random.seed(10)
array([[ 9, 15, 64, 28, 89],
[93, 29, 8, 73, 0],
[40, 36, 16, 11, 54],
[88, 62, 33, 72, 78]])
二、ndarray的属性
4个必记参数:
- ndim:维度
- shape:形状(各维度的长度)
- size:总长度
- dtype:数组元素类型
img_arr = plt.imread('./cat.jpg') # 表示为三维的数据
img_arr.ndim # 3
img_arr.shape # (456, 730, 3)
img_arr.size # 998640
img_arr.dtype # dtype('uint8')
# 一个字节8位,代表的是8位
type(img_arr) # numpy.ndarray
# 创建np数组的是 ndarray类型
三、ndarray的基本操作
1. 索引
一维与列表完全一致 多维时同理
np.random.seed(10) #随机因子/时间种子
arr = np.random.randint(0,100,size=(5,7))
arr
#array([[ 9, 15, 64, 28, 89, 93, 29],
[ 8, 73, 0, 40, 36, 16, 11],
[54, 88, 62, 33, 72, 78, 49],
[51, 54, 77, 69, 13, 25, 13],
[92, 86, 30, 30, 89, 12, 65]])
# 取到两行
arr[[1,2]]
# array([[ 8, 73, 0, 40, 36, 16, 11],
# [54, 88, 62, 33, 72, 78, 49]])
# 取一行
arr[1]
# array([ 8, 73, 0, 40, 36, 16, 11])
# 取第一行的第二列的数值
arr[1,2]
# 0
2. 切片
一维与列表完全一致 多维时同理
# 原始数据
arr
array([[ 9, 15, 64, 28, 89, 93, 29],
[ 8, 73, 0, 40, 36, 16, 11],
[54, 88, 62, 33, 72, 78, 49],
[51, 54, 77, 69, 13, 25, 13],
[92, 86, 30, 30, 89, 12, 65]])
# 这是索引取值
arr[[0,1]]
array([[ 9, 15, 64, 28, 89, 93, 29],
[ 8, 73, 0, 40, 36, 16, 11]])
# 获取二维数组前两行
arr[0:2] # 这是切片取值
array([[ 9, 15, 64, 28, 89, 93, 29],
[ 8, 73, 0, 40, 36, 16, 11]])
#获取二维数组前两列
# arr[行,列]
arr[:,0:2]
array([[ 9, 15],
[ 8, 73],
[54, 88],
[51, 54],
[92, 86]])
#获取二维数组前两行和前两列数据
arr[0:2,0:2]
array([[ 9, 15],
[ 8, 73]])
将数据反转,例如[1,2,3]---->[3,2,1]
::进行切片
# 原始数据
arr
array([[ 9, 15, 64, 28, 89, 93, 29],
[ 8, 73, 0, 40, 36, 16, 11],
[54, 88, 62, 33, 72, 78, 49],
[51, 54, 77, 69, 13, 25, 13],
[92, 86, 30, 30, 89, 12, 65]])
#将数组的行倒序
arr[::-1]
array([[92, 86, 30, 30, 89, 12, 65],
[51, 54, 77, 69, 13, 25, 13],
[54, 88, 62, 33, 72, 78, 49],
[ 8, 73, 0, 40, 36, 16, 11],
[ 9, 15, 64, 28, 89, 93, 29]])
#列倒序
arr[:,::-1]
array([[29, 93, 89, 28, 64, 15, 9],
[11, 16, 36, 40, 0, 73, 8],
[49, 78, 72, 33, 62, 88, 54],
[13, 25, 13, 69, 77, 54, 51],
[65, 12, 89, 30, 30, 86, 92]])
#全部倒序
arr[::-1,::-1]
array([[65, 12, 89, 30, 30, 86, 92],
[13, 25, 13, 69, 77, 54, 51],
[49, 78, 72, 33, 62, 88, 54],
[11, 16, 36, 40, 0, 73, 8],
[29, 93, 89, 28, 64, 15, 9]])
#将图片进行全倒置操作
plt.imshow(img_arr) # 这是图片的原始数据
# <matplotlib.image.AxesImage at 0x1cf92125320>
# 行倒置
plt.imshow(img_arr[:,::-1,:])
# 列倒置
plt.imshow(img_arr[::-1,:,:])
# 全部倒置+颜色变色
plt.imshow(img_arr[::-1,::-1,::-1])
#裁剪
plt.imshow(img_arr)
plt.imshow(img_arr[115:340,145:580,:])
3.变形
使用arr.reshape()函数,注意参数是一个tuple!
基本使用
1.将一维数组变形成多维数组
1.将多维数组变形成一维数组
arr_1 = arr.reshape((35,))
arr_1
array([ 9, 15, 64, 28, 89, 93, 29, 8, 73, 0, 40, 36, 16, 11, 54, 88, 62,
33, 72, 78, 49, 51, 54, 77, 69, 13, 25, 13, 92, 86, 30, 30, 89, 12,
65])
arr_1.reshape((1,35))
array([[ 9, 15, 64, 28, 89, 93, 29, 8, 73, 0, 40, 36, 16, 11, 54, 88,
62, 33, 72, 78, 49, 51, 54, 77, 69, 13, 25, 13, 92, 86, 30, 30,
89, 12, 65]])
arr_1.reshape((35,1))
2.将一维数组变形成多维数组
arr_1.reshape((-1,5)) # 将 一维变为多维
array([[ 9, 15, 64, 28, 89],
[93, 29, 8, 73, 0],
[40, 36, 16, 11, 54],
[88, 62, 33, 72, 78],
[49, 51, 54, 77, 69],
[13, 25, 13, 92, 86],
[30, 30, 89, 12, 65]])
arr.shape # (5, 7)
4.级联:
级联:就是对多个numpy数据进行横向或者纵向的拼接
- np.concatenate()
1.一维,二维,多维数组的级联,实际操作中级联多为二维数组
np.concatenate((arr,arr),axis=0) #axis=0 列 1行
array([[ 9, 15, 64, 28, 89, 93, 29],
[ 8, 73, 0, 40, 36, 16, 11],
[54, 88, 62, 33, 72, 78, 49],
[51, 54, 77, 69, 13, 25, 13],
[92, 86, 30, 30, 89, 12, 65],
[ 9, 15, 64, 28, 89, 93, 29],
[ 8, 73, 0, 40, 36, 16, 11],
[54, 88, 62, 33, 72, 78, 49],
[51, 54, 77, 69, 13, 25, 13],
[92, 86, 30, 30, 89, 12, 65]])
2.合并两张照片
# 行合并
arr_3 = np.concatenate((img_arr,img_arr),axis=0)
plt.imshow(arr_3)
# 列合并
arr_3 = np.concatenate((img_arr,img_arr),axis=1)
plt.imshow(arr_3)
# 四个图片合并
arr_3 = np.concatenate((img_arr,img_arr),axis=1)
arr_9 = np.concatenate((arr_3,arr_3),axis=0)
plt.imshow(arr_9)
# 九宫格 几张图片合并
arr_3 = np.concatenate((img_arr,img_arr,img_arr),axis=1)
arr_9 = np.concatenate((arr_3,arr_3,arr_3),axis=0)
plt.imshow(arr_9)
四、ndarray的聚合操作
# 原始数据
arr
array([[ 9, 15, 64, 28, 89, 93, 29],
[ 8, 73, 0, 40, 36, 16, 11],
[54, 88, 62, 33, 72, 78, 49],
[51, 54, 77, 69, 13, 25, 13],
[92, 86, 30, 30, 89, 12, 65]])
1. 求和np.sum
arr.sum(axis=1)
# array([327, 184, 436, 302, 404])
2. 最大最小值:np.max/ np.min
arr.min(axis=0)# 获取列中最大的
# array([ 8, 15, 0, 28, 13, 12, 11])
arr.max(axis=1) # 获取行中最大的
# array([93, 73, 88, 77, 92])
3.平均值:np.mean()
arr.mean(axis=1) # 获取行中的平均值
# array([46.71428571, 26.28571429, 62.28571429, 43.14285714, 57.71428571])
4.其他聚合操作
Function Name NaN-safe Version Description
np.sum np.nansum Compute sum of elements
np.prod np.nanprod Compute product of elements
np.mean np.nanmean Compute mean of elements
np.std np.nanstd Compute standard deviation
np.var np.nanvar Compute variance
np.min np.nanmin Find minimum value
np.max np.nanmax Find maximum value
np.argmin np.nanargmin Find index of minimum value
np.argmax np.nanargmax Find index of maximum value
np.median np.nanmedian Compute median of elements
np.percentile np.nanpercentile Compute rank-based statistics of elements
np.any N/A Evaluate whether any elements are true
np.all N/A Evaluate whether all elements are true
np.power 幂运算
五、ndarray的排序
1. 快速排序
np.sort()与ndarray.sort()都可以,但有区别:
# 原始数据
arr
array([[ 9, 15, 64, 28, 89, 93, 29],
[ 8, 73, 0, 40, 36, 16, 11],
[54, 88, 62, 33, 72, 78, 49],
[51, 54, 77, 69, 13, 25, 13],
[92, 86, 30, 30, 89, 12, 65]])
np.sort(arr,axis=0)
array([[ 8, 15, 0, 28, 13, 12, 11],
[ 9, 54, 30, 30, 36, 16, 13],
[51, 73, 62, 33, 72, 25, 29],
[54, 86, 64, 40, 89, 78, 49],
[92, 88, 77, 69, 89, 93, 65]])

浙公网安备 33010602011771号