一、numpy简介
numpy官方文档:https://docs.scipy.org/doc/numpy/reference/?v=20190307135750
numpy是Python的一种开源的数值计算扩展库。这种库可用来存储和处理大型numpy数组,比Python自身的嵌套列表结构要高效的多(该结构也可以用来表示numpy数组)。
numpy库有两个作用:
- 区别于list列表,提供了数组操作、数组运算、以及统计分布和简单的数学模型
- 计算速度快,甚至要由于python内置的简单运算,使得其成为pandas、sklearn等模块的依赖包。高级的框架如TensorFlow、PyTorch等,其数组操作也和numpy非常相似。
二、为什么用numpy
lis1 = [1, 2, 3]
lis2 = [4, 5, 6]
lis1
[1, 2, 3]
lis2
[4, 5, 6]
如果我们想让lis1 * lis2得到一个结果为lis_res = [4, 10, 18],非常复杂。
三、创建numpy数组
numpy数组即numpy的ndarray对象,创建numpy数组就是把一个列表传入np.array()方法。
import numpy as np
# np.array? 相当于pycharm的ctrl+鼠标左键
#1. 创建一维的ndarray对象
arr = np.array([1, 2, 3])
print(arr, type(arr))
[1 2 3] <class 'numpy.ndarray'>
#2. 创建二维的ndarray对象
print(np.array([[1, 2, 3], [4, 5, 6]]))
[[1 2 3]
[4 5 6]]
#3. 创建三维的ndarray对象
print(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))
[[1 2 3]
[4 5 6]
[7 8 9]]
四、numpy数组的常用属性
属性 | 解释 |
---|---|
T | 数组的转置(对高维数组而言) |
dtype | 数组元素的数据类型 |
size | 数组元素的个数 |
ndim | 数组的维数 |
shape | 数组的维度大小(以元组形式) |
astype | 类型转换 |
dtype种类:bool_, int(8,16,32,64), float(16,32,64)
arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float32)
print(arr)
[[1. 2. 3.]
[4. 5. 6.]]
print(arr.T)
[[1. 4.]
[2. 5.]
[3. 6.]]
print(arr.dtype)
float32
arr = arr.astype(np.int32)
print(arr.dtype)
print(arr)
int32
[[1 2 3]
[4 5 6]]
print(arr.size)
6
print(arr.ndim)
2
print(arr.shape)
(2, 3)
五、获取numpy数组的行列数
由于numpy数组是多维的,对于二维的数组而言,numpy数组就是既有行又有列。
注意:对于numpy我们一般多讨论二维的数组。
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
[[1 2 3]
[4 5 6]]
#1. 获取numpy数组的行和列构成的数组
print(arr.shape)
(2, 3)
#2. 获取numpy数组的行
print(arr.shape[0])
2
#3. 获取numpy数组的列
print(arr.shape[1])
3
六、切割numpy数组
切分numpy数组类似于列表的切割,但是与列表的切割不同的是,numpy数组的切割涉及到行和列的切割,但是两者切割的方式都是从索引0开始,并且取头不取尾。
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(arr)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
#1. 取所有元素
print(arr[:, :])
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
#2. 取第一行的所有元素
print(arr[:1, :])
[[1 2 3 4]]
#3. 取第一行的所有元素
print(arr[0, [0, 1, 2, 3]])
[1 2 3 4]
#4. 取第一列的所有元素
print(arr[:, :1])
[[1]
[5]
[9]]
#5. 取第一列的所有元素
print(arr[(0, 1, 2), 0])
[1 5 9]
#6. 取第一行第一列的元素
print(arr[(0, 1, 2), 0])
[1 5 9]
#7. 取第一行第一列的元素
print(arr[0, 0])
1
#8. 取大于5的元素,返回一个数组
print(arr[arr > 5])
[ 6 7 8 9 10 11 12]
#9. numpy数组按运算符取元素的原理,即通过arr > 5生成一个布尔numpy数组
print(arr > 5)
[[False False False False]
[False True True True]
[ True True True True]]
七、numpy数组元素替换
numpy数组元素的替换,类似于列表元素的替换,并且numpy数组也是一个可变类型的数据,即如果对numpy数组进行替换操作,会修改原numpy数组的元素,所以下面我们用.copy()方法举例numpy数组元素的替换。
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(arr)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
#1. 取第一行的所有元素,并且让第一行的元素都为0
arr1 = arr.copy()
arr1[:1, :] = 0
print(arr1)
[[ 0 0 0 0]
[ 5 6 7 8]
[ 9 10 11 12]]
#2. 取所有大于5的元素,并且让大于5的元素为0
arr2 = arr.copy()
arr2[arr > 5] = 0
print(arr2)
[[1 2 3 4]
[5 0 0 0]
[0 0 0 0]]
#3. 对numpy数组清零
arr3 = arr.copy()
arr3[:, :] = 0
print(arr3)
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
八、numpy数组的合并
arr1 = np.array([[1, 2], [3, 4], [5, 6]])
print(arr1)
[[1 2]
[3 4]
[5 6]]
arr2 = np.array([[7, 8], [9, 10], [11, 12]])
print(arr2)
[[ 7 8]
[ 9 10]
[11 12]]
#1. 合并两个numpy数组的行,注意使用hstack()方法合并numpy数组,numpy数组应该有相同的行,其中hstack的h表示horizontal水平的
print(np.hstack((arr1, arr2)))
[[ 1 2 7 8]
[ 3 4 9 10]
[ 5 6 11 12]]
#2. 合并两个numpy数组,其中axis=1表示合并两个numpy数组的行
print(np.concatenate((arr1, a