Python数据分析numpy入门
Posted Geek_bao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据分析numpy入门相关的知识,希望对你有一定的参考价值。
Python数据分析基础
一、numpy简易入门
1.1 认识numpy数组对象
import numpy as np # 导入numpy工具包
data = np.arange(12).reshape(3, 4) # 创建一个3行4列的数组
print(data) # 输出数组
print(type(data)) # 输出数据类型
print(data.ndim) # 数组维度的个数,输出结果为2表示二维数组
print(data.shape) # 输出数组维度,输出(3,4)表示三行四列
print(data.size) # 数组元素的个数,输出结果为12,表示总共有12个元素
print(data.dtype) # 数组元素的类型,输出结果int32,表示元素类型都是int32
输出结果如下:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
<class 'numpy.ndarray'>
2
(3, 4)
12
int32
Process finished with exit code 0
1.2 创建numpy数组
import numpy as np # 导入numpy工具包
data1 = np.array([1, 2, 3]) # 创建一个一维数组
print(data1)
data2 = np.array([[1, 2, 3], [4, 5, 6]]) # 创建一个二维数组
print(data2)
data3 = np.zeros((3, 4)) # 创建一个全0数组
print(data3)
data4 = np.ones((3, 4)) # 创建一个全1数组
print(data4)
data5 = np.empty((5, 2)) # 创建全空数组,其实每个值都是接近0的值
print(data5)
print(np.arange(1, 20, 5))
print(np.array([1, 2, 3, 4], float))
print(np.ones((2, 3), dtype='float64'))
输出结果如下:
[1 2 3]
[[1 2 3]
[4 5 6]]
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[6.23042070e-307 8.90092016e-307]
[1.29060871e-306 1.33511290e-306]
[1.11261027e-306 1.11261502e-306]
[1.42410839e-306 7.56597770e-307]
[6.23059726e-307 1.42419530e-306]]
[ 1 6 11 16]
[1. 2. 3. 4.]
[[1. 1. 1.]
[1. 1. 1.]]
Process finished with exit code 0
1.3 ndarry对象的数据类型
(1)查看数据类型
import numpy as np # 导入numpy工具包
data_one = np.array([[1, 2, 3],
[4, 5, 6]])
print(data_one.dtype.name)
输出结果如下:
int32
(2)转换数据类型
import numpy as np # 导入numpy工具包
data = np.array([[1, 2, 3], [4, 5, 6]])
print(data.dtype)
float_data = data.astype(np.float64) # 数据类型转换为float64
print(float_data.dtype)
float_data = np.array([1.2, 2.3, 3.5])
print(float_data)
int_data = float_data.astype(np.int64)
print(int_data)
str_data = np.array(['1', '2', '3'])
int_data = str_data.astype(np.int64)
print(int_data)
输出结果如下:
int32
float64
[1.2 2.3 3.5]
[1 2 3]
[1 2 3]
1.4 数组运算
(1)向量化运算
import numpy as np # 导入numpy工具包
data1 = np.array([[1, 2, 3], [4, 5, 6]])
data2 = np.array([[1, 2, 3], [4, 5, 6]])
print(data1 + data2) # 数组相加
print(data1 * data2) # 数组相乘
print(data1 - data2) # 数组相减
print(data1 / data2) # 数组相除
输出结果如下:
[[ 2 4 6]
[ 8 10 12]]
[[ 1 4 9]
[16 25 36]]
[[0 0 0]
[0 0 0]]
[[1. 1. 1.]
[1. 1. 1.]]
Process finished with exit code 0
由结果可以看出数组向量化运算就是对应位置进行相应的运算。
(2)数组广播
numpy数组间的基础运算是一对一,也就是a.shape==b.shape,但是当两者不一样的时候,就会自动触发广播机制,如下例子:
import numpy as np # 导入numpy工具包
arr1 = np.array([[0], [1], [2], [3]])
print(arr1.shape)
arr2 = np.array([1, 2, 3])
print(arr2.shape)
print(arr1 + arr2)
输出结果如下:
(4, 1)
(3,)
[[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]]
Process finished with exit code 0
(3)数组与标量间的运算
import numpy as np # 导入numpy工具包
data1 = np.array([[1, 2, 3], [4, 5, 6]])
data2 = 10
print(data1 + data2) # 数组相加
print(data1 * data2) # 数组相乘
print(data1 - data2) # 数组相减
print(data1 / data2) # 数组相除
输出结果如下:
[[11 12 13]
[14 15 16]]
[[10 20 30]
[40 50 60]]
[[-9 -8 -7]
[-6 -5 -4]]
[[0.1 0.2 0.3]
[0.4 0.5 0.6]]
Process finished with exit code 0
1.5 ndarray的索引和切片
(1)我们一起来来总结一下,看下面切片取值方式(对应颜色是取出来的结果):
(2)代码示例如下:
import numpy as np # 导入numpy工具包
arr = np.arange(8) # 创建一个一维数组
print(arr)
print(arr[5]) # 获取索引为5的元素
print(arr[3:5]) # 获取索引为3-5的元素,但不包括5
print(arr[1:6:2]) # 获取索引为1-6的元素,步长为2
输出结果如下:
[0 1 2 3 4 5 6 7]
5
[3 4]
[1 3 5]
Process finished with exit code 0
再看一个例子:
import numpy as np # 导入numpy工具包
arr2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]) # 创建二维数组
print(arr2d)
print(arr2d[1])
print(arr2d[0, 1])
print(arr2d[:2])
print(arr2d[0:2, 0:2])
print(arr2d[1, :2])
输出结果如下:
[[1 2 3]
[4 5 6]
[7 8 9]]
[4 5 6]
2
[[1 2 3]
[4 5 6]]
[[1 2]
[4 5]]
[4 5]
(3)花式(数组)索引的基本使用
import numpy as np # 导入numpy工具包
demo_arr = np.empty((4, 4)) # 创建一个空数组
for i in range(4):
demo_arr[i] = np.arange(i, i + 4) # 动态地为数组添加元素
print(demo_arr)
print(demo_arr[[0, 2]]) # 获取索引为[0,2]的元素
print(demo_arr[[1, 3], [1, 2]]) # 获取索引为(1,1)和(3,2)的元素
输出结果如下:
[[0. 1. 2. 3.]
[1. 2. 3. 4.]
[2. 3. 4. 5.]
[3. 4. 5. 6.]]
[[0. 1. 2. 3.]
[2. 3. 4. 5.]]
[2. 5.]
Process finished with exit code 0
(4)布尔型
import numpy as np # 导入numpy工具包
student_name = np.array(['Tom', 'Lily', 'Jack', 'Rose'])
print(student_name)
student_score = np.array([[79, 88, 80], [89, 90, 92], [83, 78, 85], [78, 76, 80]])
print(student_score)
# 对student_name和字符串“Jack”通过运算符产生一个布尔型数组
print(student_name == 'Jack')
# 将布尔数组作为索引应用于存储成绩的数组student_score,
# 返回的数据是True值对应的行
print(student_score[student_name == 'Jack', :1])
输出结果如下:
['Tom' 'Lily' 'Jack' 'Rose']
[[79 88 80]
[89 90 92]
[83 78 85]
[78 76 80]]
[False False True False]
[[83]]
说明:先对student_name和字符串“Jack”通过运算符产生一个布尔型数组,将布尔数组作为索引应用于存储成绩的数组student_score,返回的数据是True值对应的行。最后:1表示第0个元素。
1.6 数组的转置和轴对称
import numpy as np # 导入numpy工具包
arr = np.arange(12).reshape(3, 4)
print(arr)
print(arr.T) # 使用T对数组进行转置
arr = np.arange(16).reshape((2, 2, 4))
print(arr)
print(arr.transpose(1, 2, 0)) # 使用transpose()方法对数组进行转置
print(arr)
print(arr.swapaxes(1, 0)) # 使用swapaxes方法对数组进行转置
输出结果如下:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
[[[ 0 1 2 3]
[ 4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]]
[[[ 0 8]
[ 1 9]
[ 2 10]
[ 3 11]]
[[ 4 12]
[ 5 13]
[ 6 14]
[ 7 15]]]
[[[ 0 1 2 3]
[ 4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]]
[[[ 0 1 2 3]
[ 8 9 10 11]]
[[ 4 5 6 7]
[12 13 14 15]]]
Process finished with exit code 0
说明:arr.transpose(1, 2, 0)中的的1,2,0三个数分别代表shape()的三个数的顺序,初始的shape是(2,2,4),也就是2维的2 x 4矩阵,索引分别是shape的 [0], [1], [2]。
使用arr.transpose((1,2,0))之后,我们的索引就变成了shape[1],[2],[0]对应shape值是shape(2,4,2),所以矩阵形变化如上输出所示。
与此同时,我们矩阵的索引也发生了类似变化,如arr中的4,索引是arr[0,1,0],arr中的5是arr[0,1,1],transpose()后,4的位置应该是在[1,0,0],5的位置变成[1,1,0],同理8的索引从[1,0,0]变成[0,0,1]。
对于swapaxes(1, 0)可知,轴2不变,轴1和0位置互换。
1.7 numpy通用函数
import numpy as np # 导入numpy工具包
arr = np.array([4, 9, 16])
print(np.sqrt(arr)) # 开方
print(np.abs(arr)) # 求绝对值
print(np.square(arr)) # 求平方
x = np.array([12, 9, 13, 15])
y = np.array([11, 10numpy基础入门