ndarray 数据类型:
整型: int, int8(i1), int16(i2), int32(i4), int64(i8)
无符号整形: uint8(u1), uint16(u2), uint32(u4), uint64(u8)
浮点型: float16(f2), float32(f4), float64(f8)
字符型: string_ (S)
布尔型: bool(b)
优先级 str > float > int (函数中有int和float类型都会转化为float类型)
ndarray数组创建 array
l = [1, 2, 4, 5, 6, 7, 8, 9, 0]
n = np.array(l)
print(n, type(n), sep = "\t") # [1 2 4 5 6 7 8 9 0] <class 'numpy.ndarray'>
n1 = np.array([3.14, 3, 3, 5.02])
print(n1, n1.dtype, type(n1), sep = '\t') # [3.14 3. 3. 5.02] float64 <class 'numpy.ndarray'>
n2 = np.array([3.14, 'hello', 4])
print(n2, n2.dtype, type(n2), sep = "\t") # ['3.14' 'hello' '4'] <U32 <class 'numpy.ndarray'>
np的routies函数创建
np.ones(shape, dtype, order) 创建一个所有元素都为1的多维数据
shape: 创建数组的大小
dtype : 创建的数据类型
order : {'C', 'F'}, 可选, 默认值: C 是否在内存中以行优先(C 样式)或列优先(Fortran 样式)顺序存储多维数据。
mat = np.ones([3,4], dtype = np.int16)
print(mat)
print(mat.shape, mat.dtype,sep = '\t')
运行结果
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
(3, 4) int16
np.zero(shape, dtype, order) 创建一个所有元素都为0的多维数据
shape : 创建数组的大小
dtype : 创建数组数据类型
order : {'C', 'F'}, 可选, 默认值: C 是否在内存中以行优先(C 样式)或列优先(Fortran 样式)顺序存储多维数据。
mat1 = np.zeros([4, 3], dtype = np.uint32)
print(mat1, mat1.shape, mat1.dtype, sep = "\t")
运行结果
[[0 0 0]
[0 0 0]
[0 0 0]
[0 0 0]] (4, 3) uint32
np.full(shape, fill_value = None, order = 'C')
shape : 创建数组的大小
dtype : 创建数组数据类型
order : {'C', 'F'}, 可选, 默认值: C 是否在内存中以行优先(C 样式)或列优先(Fortran 样式)顺序存储多维数据。
mat2 = np.full(shape = [4, 3], fill_value = 4)
print(mat2, mat2.shape, mat2.dtype)
运行结果
[[4 4 4]
[4 4 4]
[4 4 4]
[4 4 4]] (4, 3) int32
创建一个单位矩阵
np.eye(N, M, k = 0, dtype)
N: 表示行数
M: 表示列数
k: 表示偏移多少个值
dtype: 表示类型
eye1 = np.eye(10, 10, k = 1, dtype = np.int32)
print(eye1)
运行结果
[[0 1 0 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0]
[0 0 0 1 0 0 0 0 0 0]
[0 0 0 0 1 0 0 0 0 0]
[0 0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 1 0 0]
[0 0 0 0 0 0 0 0 1 0]
[0 0 0 0 0 0 0 0 0 1]
[0 0 0 0 0 0 0 0 0 0]]
np.linspace(start, stop, num, endpoint, restep, dtype)
start: 开始数据
stop: 结束数据
num : 开始到结束有多少个数
endpoint: 是否包含结束值
retstep : 是否返回步长
dtype: 表示类型
equal_different = np.linspace(1, 100, 99, endpoint = False, retstep= False, dtype = np.float32)
print(equal_different)
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54.
55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72.
73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90.
91. 92. 93. 94. 95. 96. 97. 98. 99.]
迭代数
np.arange(start, stop, step, dtype)
start : 开始的数据
stop : 结束的数据
step : 步长
dtype : 表示类型
print(np.arange(1, 100, 3, dtype = np.int32))
运行结果
[ 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70
73 76 79 82 85 88 91 94 97]
随机数
np.random.randint(low, high, size, dtype) 生成low~high 的随机整数
low: 随机的最小范围
high : 随机的最大范围
size : 矩阵的大小
dtype: 类型
np.random.randn(d1, d2, d3, ...) 生成标准正态分布 mean = 0, variance = 1
dn:表示n为数据维度
np.random.normal(loc = 0.0, scale = 1.0, size = None) 正态分布
loc 设置均值
scale 设置标准差
size 数组的大小
np.random.random(size = None) 0~1左闭右开
size 数组的大小
np.random.rand(d0, d1, d2, d3...) 0~1左闭右开
dn:表示n为数据维度
print(np.random.randint(1, 100, [4, 3], dtype = np.int32))
print(np.random.randn(10))
print(np.random.normal(10, 100, [4, 3]))
print(np.random.random([4, 3]))
print(np.random.rand(3))
运行结果
[[88 59 31]
[12 60 64]
[78 56 1]
[57 99 33]]
[-0.15406983 -0.88448019 -1.51401254 -0.87255222 -1.35761635 0.46479609
0.80304423 0.23123112 -0.12478477 0.18392227]
[[ -44.74587405 -139.79543522 16.03411604]
[ 40.13010034 32.05397835 57.64575227]
[ -0.584161 147.48423436 -118.35407941]
[ 1.61221886 32.62856579 -117.69078916]]
[[0.38389696 0.52576674 0.8813099 ]
[0.48278753 0.24980853 0.70270774]
[0.73416502 0.64101706 0.23828767]
[0.16902304 0.77243354 0.5101739 ]]
[0.41402817 0.17397814 0.46619177]
ndarray 属性
ndim 查看维度
shape 查看形状
size 总长度
dtype 元素类型
rnd = np.random.randint(1, 100, [4, 5], dtype = np.int32)
print(rnd.ndim, rnd.shape, rnd.size, rnd.dtype, sep = "\n")
运行结果
2
(4, 5)
20
int32
三、 ndarray 的基本操作
一、 索引
l = [1, 2, 3, 4, 5, 6, 7]
n = np.array(l)
print(n[-1], n[3])
li = np.random.randint(1, 10, [3, 4, 2], dtype=np.int32)
print(li, li[:1, :, :], li[2, 3, 0], li[1,[1,3],0], sep="\n")
li[1,[1,3],0] 取出不连续的值
切片 [start: end: step]
arr1 = np.random.randint(1, 10, [2, 28, 28, 3], dtype = np.int32)
arr2 = arr1[:,1:14, ::2, 1]
print(arr2, arr2.shape)
修改数据
arr1[1,3,3,0] = 88000
ndarray变形: reshape
mat3 = np.random.normal(loc = 0, scale = 1, size = [4, 28, 28, 3])
mat1 = np.reshape(mat3, (4, 784, 3))
print(mat1.shape)
ndarray级联: concatenate/ hstack/ vstack
n1 = np.random.randint(1, 100, (3, 4))
n2 = np.random.randint(1, 100, (3, 4))
print(np.concatenate((n1, n2), axis=0)) # 按照一维进行合并
print(np.concatenate((n1, n2), axis=1)) # 按照二维进行合并
print(np.vstack((n1, n2))) # 上下合并
print(np.hstack((n1, n2))) # 左右合并
ndarray拆分: split, vsplit, hsplit
n3 = np.random.randint(1, 100, (6, 4))
'''
ndarray 要拆分的数组
indices_or_sections 拆分的次数
axis 对象的维度
'''
print(np.split(n3, 3))
print(np.vsplit(n3, 3)) # 上下拆分
print(np.hsplit(n3, 2)) # 左右拆分
拷贝 copy (深拷贝)
n1 = np.arange(1, 10)
n2 = n1.copy()
n2[2] = 100
print(n1, n2)
Numpy 矩阵的操作
算法运算数: 加减乘除 矩阵的之间的运算 数与矩阵的乘法
矩阵的乘积: 矩阵和矩阵相乘np.dot() 矩阵的逆 : np.linalg.inv()
矩阵的行列式: np.linalg.det() 矩阵的秩 : np.linalg.inv()
矩阵的特征值: np.linalg.eig()
广播机制:
为不同维度矩阵提供运算的可能性
规则1: 为缺失的维度补维度
规则2: 缺失维度的值用已有值填充
n1 = np.random.randint(0, 10, size = (4, 5))
print(n1)
print(n1 + 10, n1 - 10, n1 * 10, n1 / 10, n1 // 3, n1 ** 2, n1 % 2, sep = "\n")
n2 = np.random.randint(0, 10, size = (4, 5))
print(n1 + n2, n1 - n2, sep = "\n")
n3 = np.random.randint(0, 10, size = (5, 3))
print(np.dot(n1, n3))
n4 = np.array([[1, 2, 3], [4, 2, 6], [2, 9, 4]])
print(n4)
print(np.linalg.inv(n4))
print(np.linalg.det(n4))
print(np.linalg.matrix_rank(n4))
print(np.linalg.eig(n4))
numpy 几个操作:
求和: sum(), 最小值:min() 最大值:max() 平均值: mean() 平均值:average() 中位数: median()
百分比: percentile() 最小值对应下标: argmin() 最大值对应下标: argmax()
标准差: std() 方差:var() 幂: power() 按条件查找(True, False): argwhere()
n1 = np.random.randint(1, 100, (10, 5))
print(np.sum(n1), np.min(n1), np.max(n1), np.mean(n1), np.average(n1), np.median(n1))
print(np.std(n1), np.var(n1))
print(np.argmin(n1), np.argmax(n1),sep = "\n")
print(np.argwhere([76, 45, 23, 1] == np.min(n1)))
n2 = np.random.randint(1, 10, 8)
print(np.percentile(n2, q = 10))
print(np.power(123, 3))
运行结果
2853 3 98 57.06 57.06 62.0
29.103546175681064 847.0164
41
28
[]
1.0
1860867
其他常见的数学操作
abs() 绝对值 sqrt() 平方根 square() 次方 exp() e的次方
sin() cos() tan() 取整(round() 四舍五入 ceil() 向无穷大取整 floor 向无穷小取整)
cumsum() 累加 log() 自然对数 (np.log()以e为底, np.log2() 以2为底 np.log10() 以10为底)
sort() 排序
文件操作:
save: 保存ndarray到npy文件
savez: 将多个array保存到一个npy文件
load: 读取npy文件
存储csv或txt
savetxt(file, delimiter) delimiter 分隔符
读取csv或txt
loadtxt(file, delimiter)