《利用Python进行数据分析》笔记(1)——第四章:Numpy模块
1. 创建ndarry
ndarry就是n维数组
1.1 用np.array(列表、元组等)函数
用np.array()
创建数组
import numpy as np #导入Numpy模块
#将一个元组转换成一维数组
data1 = (2, 4, 6.7)
array1 = np.array(data1)
array1
Out[8]: array([ 2. , 4. , 6.7])
#将一个等长的嵌套元组转换成二维数组
data2 = ((7, 90,8), (1, 4.5, 0))
array2 = np.array(data2)
arrary2
Out[11]:
array([[ 7. , 90. , 8. ],
[ 1. , 4.5, 0. ]])
用数组名.ndim 数组名.shape
查看数组属性
#查看array2的维度和几行几列
array2.ndim
Out[13]: 2
array2.shape
Out[14]: (2, 3)
1.2用np.zeros/ones/empty/arange/eye创建特殊数组
用np.zeros()
创建全是0的数组 np.ones()
同理
np.zeros(4)
Out[15]: array([ 0., 0., 0., 0.])
np.zeros((4,5))
Out[16]:
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
用np.empty()
创建垃圾值数组(即任意值,注意不是创建出全是0的数组)
np.empty((2,4))
Out[17]:
array([[ 0.00000000e+000, -1.49166824e-154, 2.12688503e-314,
2.34664926e-314],
[ 0.00000000e+000, 0.00000000e+000, -1.72723382e-077,
5.56268610e-309]])
用np.arrange()
创建有序数组(range的数组版本,从0开始,只能有一个参数)
np.arange(9)
Out[18]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])
用np.eye()
创建对角矩阵(只用传一个参数)
np.eye(5)
Out[22]:
array([[ 1., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 1.]])
2. ndarry的数据类型
可以用dtype
控制ndarry的存储类型
arr1 = np.array([1, 2, 3], dtype=np.float64)
arr2 = np.array([1, 2, 3], dtype=np.int32)
arr1.dtype
Out[31]: dtype('float64')
arr2.dtype
Out[32]: dtype('int32')
用数组名.astype(数据类型)
转换dtype
用astype
无论如何都会创建出一个新的数组(即使是类型相同,也相当于一份拷贝)
#整型int和浮点型float的dtype转换
arr = np.array([1, 2, 3], dtype=np.int32)
float_arr = arr.astype(np.float64)
float_arr.dtype
Out[35]: dtype('float64')
#字符串str和浮点型float的dtype转换
numeric_strings = np.array(["1.2", "3.4"], dtype=np.string_)#这里有一个小_
numeric_strings.dtype
Out[41]: dtype('S3')
numeric_strings.astype(float)
Out[42]: array([ 1.2, 3.4])
数据类型可以直接表示为另一个数组名.dtype
使两个数组的数据类型相同
arr1 = np.arange(10)
arr2 = np.array([1, 3], dtype=np.float64)
arr1.astype(arr2.dtype)
Out[46]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
3. 数组和标量之间的运算
- 数组与数组之间的运算
大小相等的数组之间的任何运算都会应用到元素级(对应位置元素相加减);大小不同的数组之间的运算(叫broadcasting广播,第12章介绍)
arr = np.array([[1, 2, 3],[1, 2, 3]])
arr-arr
Out[49]:
array([[0, 0, 0],
[0, 0, 0]])
arr*arr
Out[50]:
array([[1, 4, 9],
[1, 4, 9]])
arr+arr
Out[51]:
array([[2, 4, 6],
[2, 4, 6]])
- 数组与标量之间的运算
标量作用于每一个元素
arr*3
Out[52]:
array([[3, 6, 9],
[3, 6, 9]])
4. 基本的索引和切片
基本的索引和切片的方法和list相同(从0开始)
arr = np.arange(10)
arr
Out[66]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[5]
Out[67]: 5
#标量赋值给切片,“广播”到整个选区
arr[5:8] = 12
arr
Out[69]: array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
和列表最大的区别:数组切片是原始数组的视图,视图上的任何修改都会反映到源数组上(没有数据的复制)
用数组名.copy(空)
来复制数组
arr_slice = arr[5:8]
arr_slice[0] = 12345
arr_slice
Out[72]: array([12345, 12, 12])
#!!源数据也会被修改!!,NumPy设计的目的是 处理大数组,如果要将数据复制来复制去会产生内存和性能的问题
arr
Out[73]: array([ 0, 1, 2, 3, 4, 12345, 12, 12, 8, 9])
不同维度的数组
#一维数组
arr1d = np.array([1,2,3])
arr1d
Out[56]: array([