利用python进行数据分析(第二版)笔记一
Numpy
1、创建ndarray对象
1、arr.ndim:Numpy数组维度信息
2、arr.shape:Numpy数组形状信息
3、np.empty并不能保证返回所有是0的数组,某些情况下,会返回初始化时的垃圾数值
2、类型转换
1、float变为int,小数点后的部分会被丢弃
2、可以用astype把string里的数字变为实际的数字
*3、astype函数总是会返回一个新的数组
3、数组计算
1、任何两个大小相等的数组之间的运算,都是element-wise(点对点)
arr = np.array([[1., 2., 3.], [4., 5., 6.]]) array([[ 1., 2., 3.], [ 4., 5., 6.]]) arr * arr array([[ 1., 4., 9.], [ 16., 25., 36.]])
2、如果涉及标量(scalar)的话,会涉及到数组的每一个元素
1 / arr array([[ 1. , 0.5 , 0.33333333], [ 0.25 , 0.2 , 0.16666667]]) arr ** 0.5 array([[ 1. , 1.41421356, 1.73205081], [ 2. , 2.23606798, 2.44948974]])
arr2 > arr
4、索引和切片
arr = np.arange(10) arr array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) arr[5:8] = 12 arr array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
*1、把12赋给arr[5:8]
,其实用到了broadcasted(广播、广式变换)
*2、python内建的list与numpy的array有个明显的区别,这里array的切片后的结果只是一个views(视图),用来代表原有array对应的元素,而不是创建了一个新的array。但list里的切片是产生了一个新的list
*3、如果想要复制,可以使用copy()方法,比如arr[5:8].copy()
4、nump索引和切片的顺序是按shape所列出的顺序进行索引和切片的
5、使用布尔索引对行进行索引
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe']) names array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4') data = np.random.randn(7, 4) data array([[ 0.85947145, -2.49437476, 1.25012184, 1.27752535], [-0.4937663 , 0.66665867, 1.42447218, -0.13281765], [ 0.37139927, -0.8753652 , 1.40390804, 0.61556806], [ 0.33419279, -0.45132649, -0.20364103, 0.3050267 ], [-0.06436347, 0.04273151, -0.47264989, 2.02201285], [-1.50137347, -0.62250184, -0.85898857, -0.33666096], [ 0.75711807, 0.05412138, -0.4199252 , 0.42394965]]) data[names == 'Bob'] array([[ 0.85947145, -2.49437476, 1.25012184, 1.27752535], [ 0.33419279, -0.45132649, -0.20364103, 0.3050267 ]])
6、使用布尔索引对列进行索引
data[names == 'Bob', 2:] array([[ 1.25012184, 1.27752535], [-0.20364103, 0.3050267 ]])
7、可以使用!=
或者~表示非
8、组合多个布尔条件,用布尔运算符&、|,python中的关键词and和or不管用
9、使用比较符号对数据进行筛选
data[data < 0] = 0 data array([[ 0.85947145, 0. , 1.25012184, 1.27752535], [ 0. , 0.66665867, 1.42447218, 0. ], [ 0.37139927, 0. , 1.40390804, 0.61556806], [ 0.33419279, 0. , 0. , 0.3050267 ], [ 0. , 0.04273151, 0. , 2.02201285], [ 0. , 0. , 0. , 0. ], [ 0.75711807, 0.05412138, 0. , 0.42394965]])
5、花式索引
1、按一定顺序选出几行,可以用一个整数list或整数ndarray来指定顺序
arr = np.empty((8, 4)) for i in range(8): arr[i] = i arr array([[ 0., 0., 0., 0.], [ 1., 1., 1., 1.], [ 2., 2., 2., 2.], [ 3., 3., 3., 3.], [ 4., 4., 4., 4.], [ 5., 5., 5., 5.], [ 6., 6., 6., 6.], [ 7., 7., 7., 7.]]) arr[[4, 3, 0, 6]] array([[ 4., 4., 4., 4.], [ 3., 3., 3., 3.], [ 0., 0., 0., 0.], [ 6., 6., 6., 6.]]) arr[[-3, -5, -7]] array([[ 5., 5., 5., 5.], [ 3., 3., 3., 3.], [ 1., 1., 1., 1.]])
2、选出指定位置元素
arr = np.arange(32).reshape((8, 4)) arr array([[ 0, 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]]) arr[[1, 5, 7, 2], [0, 3, 1, 2]] array([ 4, 23, 29, 10])
[ 4, 23, 29, 10]
分别对应(1, 0), (5, 3), (7, 1), (2, 2)
3、选取区域元素
arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]] array([[ 4, 7, 5, 6], [20, 23, 21, 22], [28, 31, 29, 30], [ 8, 11, 9, 10]])
4、先从arr中选出[1, 5, 7, 2]这四行,然后[:, [0, 3, 1, 2]]表示选中所有行,但是列的顺序要按0,3,1,2来排
6、数组转置和轴交换
1、转置也是返回一个view,而不是新建一个数组。有两种方式,一个是transpose方法,一个是T属性
arr = np.arange(8).reshape((4, 2)) print(arr.T) print(arr) [[0 2 4 6] [1 3 5 7]] [[0 1] [2 3] [4 5] [6 7]]
2、对于多维数组,transpose会接受由轴数字组成的tuple,来交换轴
arr = np.arange(16).reshape((2, 2, 4)) arr array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]]]) arr.transpose((1, 0, 2)) array([[[ 0, 1, 2, 3], [ 8, 9, 10, 11]], [[ 4, 5, 6, 7], [12, 13, 14, 15]]])
3、darray有个方法叫做swapaxes, 这个方法取两个axis值,并交换这两个轴
arr array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]]]) arr.swapaxes(1, 2) # 直交换second axis和last axis array([[[ 0, 4], [ 1, 5], [ 2, 6], [ 3, 7]], [[ 8, 12], [ 9, 13], [10, 14], [11, 15]]])
swapaxes也是返回view,不生成新的data
本文参考来源:
https://github.com/BrambleXu/pydata-notebook