转自:波哥
1、使用np.array()创建数组
import numpy as np
np.array([1,2,3,4,5]) # 创建一个一维数组
np.array([1,2,3],[4,5,6]) # 创建一个二维数组
# numpy默认ndarray的所有元素类型是相同的
# 如果传进来的列表中包含不同的类型,则统一为统一类型,优先级:str > float > int
2.使用np的函数创建数组
import numpy as np
# np.ones(shape, dtype=None, order='C')
np.ones(shape=(5, 6), dtype=int) # 创建一个元素数值为1, 形状为5行5列的二维数组
# np.zeros(shape, dtype=None, order='C')
np.zeros((5, 5)) # 创建一个元素数值为0, 形状为5行5列的二维数组
# np.full(shape, fill_value, dtype=None, order='C')
np.full((5,5),fill_value=999) # 创建一个元素数值为999, 形状为五行五列的二维数组
# np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
np.linspace(1,100,num=50) # 创建一个元素数值范围在1到100, 元素个数为50的一维数组
# np.arange([start, ]stop, [step, ]dtype=None)
np.arange(0, 100, 2) #创建一个 元素数值范围为0到100,元素数值步长为2 的一维数组
# np.random.randint(low, high=None, size=None, dtype='l')
np.random.seed(1) # 使用random.seed()方法固定随机性
np.random.randint(0, 100, size=(5, 6)) # 生成一个5行6列的二维数组, 每一个元素的值是0到100的随机数
# np.random.randn(d0, d1, ..., dn)
np.random.seed(1) # 固定随机性
np.random.randn(4, 5, 6) # 标准正太分布
# np.random.random(size=None)
np.random.seed(1) # 固定随机性
np.random.random(size=(3, 3)) # 生成0到1的随机数, 左闭右开
3.ndarray的属性
- 4个必须记住的参数:
ndim
: 维度shape
: 形状(各维度的长度)size
: 总长度dtype
: 元素类型
# 使用matplotlib.pyplot获取一个numpy数组,数据来源于一张图片
import matplotlib.pyplot as plt
img_arr = plt.imread('./wnh.jpg') # 读取图片数据,返回一个三维数组
plt.imshow(img_arr) # 显示该图片
img_arr.shape # 数组的形状
img_arr.size # 数组的总长度
img_arr.dtype # 数组元素的类型
img_arr.ndim # 数组的维度(几维数组)
4.ndarray的基本操作
import numpy as np
np.random.seed(1)
arr = np.random.randint(0, 100, size=(5, 5)) # 创建一个元素范围是0到100,形状是5行5列的随机数组
arr
##执行结果如下:
array([[37, 12, 72, 9, 75],
[ 5, 79, 64, 16, 1],
[76, 71, 6, 25, 50],
[20, 18, 84, 11, 28],
[29, 14, 50, 68, 87]])
(1)索引
# 根据索引查看元素. 注意:索引从0开始计数.
arr[0][0]
##执行结果如下:
37
# 根据索引修改元素数值
arr[0][0] = 666
arr
##执行结果如下:
array([[666, 12, 72, 9, 75],
[ 5, 79, 64, 16, 1],
[ 76, 71, 6, 25, 50],
[ 20, 18, 84, 11, 28],
[ 29, 14, 50, 68, 87]])
(2)切片
# 查看当前数组
arr
##执行结果如下:
array([[666, 12, 72, 9, 75],
[ 5, 79, 64, 16, 1],
[ 76, 71, 6, 25, 50],
[ 20, 18, 84, 11, 28],
[ 29, 14, 50, 68, 87]])
# 获取二维数组前两行
arr[0:2]
##执行结果如下:
array([[666, 12, 72, 9, 75],
[ 5, 79, 64, 16, 1]])
# 获取二位数组前两列
arr[:,0:2]
##执行结果如下:
array([[666, 12],
[ 5, 79],
[ 76, 71],
[ 20, 18],
[ 29, 14]])
# 注意: 逗号左边是行切片, 右边是列切片
# 获取二维数组前两行和前两列的数据
arr[0:2, 0:2]
##执行结果如下:
array([[666, 12],
[ 5, 79]])
# 将数组的行 倒序排列
arr[::-1,::]
##执行结果如下:
array([[ 29, 14, 50, 68, 87],
[ 20, 18, 84, 11, 28],
[ 76, 71, 6, 25, 50],
[ 5, 79, 64, 16, 1],
[666, 12, 72, 9, 75]])
# 将数组的列 倒序排列
arr[::, ::-1]
##执行结果如下:
array([[ 75, 9, 72, 12, 666],
[ 1, 16, 64, 79, 5],
[ 50, 25, 6, 71, 76],
[ 28, 11, 84, 18, 20],
[ 87, 68, 50, 14, 29]])
# 将数组的行和列 都进行倒序排列
arr[::-1, ::-1]
##执行结果如下:
array([[87, 68, 50, 14, 29],
[28, 11, 84, 18, 20],
[50, 25, 6, 71, 76],
[ 1, 16, 64, 79, 5],
[75, 9, 72, 12, 37]])
(3)变形
将一维数组变形成多维数组
import numpy as np
arr_1 = np.arange(0, 100, 4) # 创建一个元素范围为0到100,元素步长为4的一维数组
arr_1.reshape((-1, 5)) # 将一维数组变形成多维数组
##执行结果如下:
array([[ 0, 4, 8, 12, 16],
[20, 24, 28, 32, 36],
[40, 44, 48, 52, 56],
[60, 64, 68, 72, 76],
[80, 84, 88, 92, 96]])
将多维数组变形成一维数组
import numpy as np
np.random.seed(1) # 固定随机性
arr_2 = np.random.randint(0, 100, size=(5, 5)) # 创建一个5行5列的随机数组
arr_2 = arr_2.reshape((25,)) # 将多维数组变形成一维数组
arr_2
##执行结果如下:
array([37, 12, 72, 9, 75, 5, 79, 64, 16, 1, 76, 71, 6, 25, 50, 20, 18, 84, 11, 28, 29, 14, 50, 68, 87])
(4)级联
语法: np.concatenate((arr1, arr2), axis=1)
参数:
- arr1, arr2表示要级联的数组
- axis=1表示横向级联, axis=0表示纵向级联
import numpy as np
np.random.seed(1) # 固定随机性
arr = np.random.randint(0, 100, size=(5, 5)) # 创建一个5行5列的随机数组
arr
##执行结果如下:
array([[37, 12, 72, 9, 75],
[ 5, 79, 64, 16, 1],
[76, 71, 6, 25, 50],
[20, 18, 84, 11, 28],
[29, 14, 50, 68, 87]])
np.concatenate((arr, arr), axis=1) # 将数组arr进行横向级联
##执行结果如下:
array([[37, 12, 72, 9, 75, 37, 12, 72, 9, 75],
[ 5, 79, 64, 16, 1, 5, 79, 64, 16, 1],
[76, 71, 6, 25, 50, 76, 71, 6, 25, 50],
[20, 18, 84, 11, 28, 20, 18, 84, 11, 28],
[29, 14, 50, 68, 87, 29, 14, 50, 68, 87]])
(5)切分
与级联类似, 三个函数完成切分工作:
- np.split(arr, 行/列号, 轴)
- 注意: 参数2是一个列表类型
- np.vsplit()
- np.hsplit()
(6)副本
import numpy as np
np.random.seed(1) # 固定随机性
arr = np.random.randint(0, 100, size=(5, 5)) # 创建一个5行5列的随机数组
arr
##执行结果如下:
array([[37, 12, 72, 9, 75],
[ 5, 79, 64, 16, 1],
[76, 71, 6, 25, 50],
[20, 18, 84, 11, 28],
[29, 14, 50, 68, 87]])
a = arr.copy() # 可以使用copy()函数创建副本,这样做不会对原数据造成影响
a[2][2] = 666 # 修改副本的数据不会对原数据造成影响
arr
##执行结果如下:
array([[37, 12, 72, 9, 75],
[ 5, 79, 64, 16, 1],
[76, 71, 6, 25, 50],
[20, 18, 84, 11, 28],
[29, 14, 50, 68, 87]])
a
##执行结果如下:
array([[ 37, 12, 72, 9, 75],
[ 5, 79, 64, 16, 1],
[ 76, 71, 666, 25, 50],
[ 20, 18, 84, 11, 28],
[ 29, 14, 50, 68, 87]])
5.ndarray的聚合操作
(1)求和np.sum()
import numpy as np
np.random.seed(1) # 固定随机性
arr = np.random.randint(0, 100, size=(5, 5)) # 创建一个5行5列的随机数组
arr
##执行结果如下:
array([[37, 12, 72, 9, 75],
[ 5, 79, 64, 16, 1],
[76, 71, 6, 25, 50],
[20, 18, 84, 11, 28],
[29, 14, 50, 68, 87]])
arr.sum(axis=1) # axis=1 对所有行求和
##执行结果如下:
array([205, 186, 228, 161, 248])
arr.sum(axis=0) # axis=0 对所有列求和
##执行结果如下:
array([167, 215, 276, 129, 241])
(2)最大最小值: np.max()
和np.min()
arr.max(axis=1) # 求每一行的最大值
arr.max(axis=0) # 求每一列的最大值
arr.min(axis=1) # 求每一行的最小值
arr.min(axis=0) # 求每一列的最小值
(3)平均值: np.mean()
arr.mean(axis=1) # 求每一行的平均值
arr.mean(axis=0) # 求每一列的平均值
(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 | 幂运算 |
6.ndarray的排序
快速排序
np.sort()
与ndarray.sort()
都可以, 但有区别:
np.sort()
不改变输入ndarray.sort()
本地处理, 不占用空间, 但改变输入
np.sort(arr, axis=1) # 对每一行进行升序排序
np.sort(arr, axis=0) # 对每一列进行升序排序