python-Numpy数据分析(一)
使用numpy创建数据
import numpy as np print('将普通的一维列表生成Numpy一维数组') data = [1,23,45,5,4] arr = np.array(data) print(arr) print('打印数组元素类型') print(arr.dtype) print('将普通的二维列表生成Numpy二维数组') data = [[1,23,45,5,4],[3,5,6,7,8]] arr = np.array(data) print(arr) print('打印数组维度') print(arr.shape) print('使用zeros/empty') print('生成包含10个0的一维数组') print(np.zeros(10))#生成包含10个0的一维数组 print('生成2*3的二维数组') print(np.zeros((2,3)))#生成2*3的二维数组 print('生成3*2*4的三维数组,所有元素未初始化') print(np.empty(3*2*4))#生成3*2*4的三维数组,所有元素未初始化 print('使用arange生成连续元素') print(np.arange(15))
NumPy的ndarray NumPy数据类型
import numpy as np print('生成数组时指定数据类型') arr = np.array([1,2,43,545],dtype=np.float64) print(arr.dtype) print('使用astype复制数组并转换数据类型') int_arr = np.array([1,23,454,56,54]) float_arr = int_arr.astype(np.float) print(float_arr.dtype) print('使用astype将float转换为int时小数部分舍掉') float_arr2 = np.array([1.34,2.54,4.23432,5.45454,6.54,7.5]) int_arr2 = float_arr2.astype(np.int) print(int_arr2) print('使用astype把字符串转换为数组,如果失败抛出异常') str_arr = np.array([1.2323,4.54545,6.34],dtype = np.string_) float_arr3 = str_arr.astype(dtype = np.float) print(float_arr3) print('astype使用其他数组的数据类型作为参数') int_arr3 = np.arange(10) float_arr4 = np.array([2.34,4.34],dtype=np.float64) print(int_arr3.astype(float_arr4.dtype)) print(int_arr3[0],int_arr3[1])
NumPy的ndarray 数组和标量之间的运算
import numpy as np ''' NumPy的ndarray 数组和标量之间的运算 • 不用编写循环即可对数据执行批量运算 • 大小相等的数组之间的任何算术运算都会将运算应用到元素级 • 数组与标量的算术运算也会将那个标量值传播到各个元素 ''' #数组乘法/减法,对应元素相乘/相减 arr = np.array([[1,2,3,4,5],[1,2,3,4,5]]) print(arr*arr) print(arr-arr) #标量操作作用在数组的每个元素上 arr = np.array([[1,2,3,4],[1,2,3,4]]) print(1/arr) print(arr ** 0.5)
NumPy的ndarray 基本的索引和切片
import numpy as np #通过索引访问二维数组某一行或某个元素 arr = np.array([[1,2,3,45],[6,7,8,9]]) print(arr[0]) #访问第一行数组元素 print(arr[0][1])# 访问第一行数组的第二个元素 print(arr[0,1]) # numpy访问方式,普通python不可以使用。访问第一行数组的第二个元素 #使用切片访问和操作 arr = np.array([1,2,3,4,5,6,7,8,9]) print(arr[1:6]) # 打印元素arr[1]到arr[5] arr2 = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(arr2[:2]) #打印第1、2行 print(arr2[:2,1])#打印第1、2行的第2列 print(arr2[:,:1])#打印第一行第一列的所有元素 arr2[:2,1:]=0 #将第1、2行的第2、3列设置为0 print(arr2)
NumPy的ndarray 布尔型索引
''' NumPy的ndarray 布尔型索引 • 布尔型数组的长度必须跟被索引的轴长度一致。 • 可以将布尔型数组跟切片、整数(或整数序列)混合使用 ''' import numpy as np import numpy.random as np_random print('使用boolean数组作为索引') name_arr = np.array(['Bob','libai','dufu','wangzijian','zhanguo','huanming','tangguowei']) ran_arr = np.random.randn(7,4) # 随机7*4数组 print(ran_arr) print(name_arr == 'Bob') # 返回布尔数组,元素等于'Bob'为True,否则False。 print(ran_arr[name_arr == 'Bob']) # 利用布尔数组选择行
NumPy的ndarray 花式索引
''' NumPy的ndarray 花式索引 • 花式索引(Fancy indexing)是一个NumPy术语,它指的是利用整数数组进 行索引。 • 一次传入多个索引数组会有一点特别。它返回的是一个一维数组,其中的元素 对应各个索引元组。 ''' import numpy as np print('使用整数数组作为索引') arr = np.empty((8,4)) for i in range(8): arr[i] = i print(arr) print(arr[[4,3,2,6]])# 打印arr[4]、arr[3]、arr[2]和arr[6]。 print(arr[[-3,-5,-7]]) # 打印arr[-3]、arr[-5]和arr[-7]行,就是打印倒数第3、5、7行 arr2 = np.arange(32).reshape(8,4) # 通过reshape变换成二维数组 print('arr2数组\n',arr2) print('打印arr2[1, 0]、arr[5, 3],arr[7, 1]和arr[2, 2]') print(arr2[[1,5,7,2],[0,3,1,2]]) #[ 4 23 29 10] print('arr2分别打印1、5、7、2行每行的0、3、1、2列的数据') print(arr2[[1,5,7,2]][:,[0,3,1,2]]) print('使用np.ix_()方法输出上面的效果') print(arr2[np.ix_([1,5,7,2],[0,3,1,2])])
NumPy的ndarray 数组转置和轴对换
import numpy as np import numpy.random as np_random print('转置矩阵') arr = np.arange(15).reshape((3,5)) #自动生成3行5列数组 print(arr) print(arr.T) #arr.T 改属性可以将矩阵的行和列对调,使得行变为列,列变为行 print('转置矩阵做点乘积') arr2 = np.arange(15).reshape((3,5)) print(np.dot(arr.T,arr2)) #利用np.dot计算矩阵内积XTX print('高维矩阵转换') arr3 = np.arange(16).reshape((2,2,4)) print(arr3) ''' 详细解释: arr数组的内容为 - a[0][0] = [0, 1, 2, 3] - a[0][1] = [4, 5, 6, 7] - a[1][0] = [8, 9, 10, 11] - a[1][1] = [12, 13, 14, 15] transpose的参数为坐标,正常顺序为(0, 1, 2, ... , n - 1), 现在传入的为(1, 0, 2)代表a[x][y][z] = a[y][x][z],第0个和第1个坐标互换。 - a'[0][0] = a[0][0] = [0, 1, 2, 3] - a'[0][1] = a[1][0] = [8, 9, 10, 11] - a'[1][0] = a[0][1] = [4, 5, 6, 7] - a'[1][1] = a[1][1] = [12, 13, 14, 15] ''' print('arr3高维矩阵转换') print(arr3.transpose((1, 0, 2))) print('直接交换第1和第2个坐标') print(arr3.swapaxes(1, 2)) # 直接将第1和第2个轴坐标对换
NumPy的ndarray 快速的元素级数组函数
''' NumPy的ndarray 快速的元素级数组函数 • 一元函数 I 类型 说明 abs, fabs 计算整数、浮点数或复数的绝对值。对于非复数值,可以使用更快的fabs。 sqrt 计算各元素的平方根。相当于arr ** 0.5 sqare 计算各元素的平方。相当于arr ** 2 exp 计算各元素的e^x log, log10, log2, log1p 分别为自然对数、底数为10的log、底数为2的log和log(1 + x)。 sign 计算各元素的正负号:1(正数)、0(零)、-1(负数)。 ceil 计算各元素的ceiling值,即大于等于该值的最小整数。 floor 计算各元素的floor值,即小于等于该值的最小整数。 NumPy的ndarray 快速的元素级数组函数 • 一元函数 II 类型 说明 rint 将各元素值四舍五入到最接近的整数,保留dtype。 modf 将数组的小数部分与整数部分以两个独立数组的形式返还。 isnan 返回一个表示“哪些值是NaN(这不是一个数字)”的布尔型数组 isfinite, isinf 分别返回一个表示“哪些元素是有限的(非inf,非NaN)”或“哪些元素是 无穷的”的布尔型数组 cos, cosh, sin, sinh, tan, tanh 普通型或双曲型三角函数 arccos, arccosh, arcsin, arcsinh,arctan, arctanh 反三角函数 logical_not 计算各元素not x的真值。相当于-arr。 NumPy的ndarray 快速的元素级数组函数 • 二元函数 I 类型 说明 add 将数组中对应的元素相加 subtract 从第一个数组中减去第二个数组中的元素 multiply 数组元素相乘 divide, floor_divide 除法或向下取整除法 power 对第一个数组中的元素A和第二个数组中对应位置的元素B,计算A^B。 maximum, fmax 元素级的最大值计算。fmax将忽略NaN。 minimum, fmin 元素级的最小值计算。fmin将忽略NaN。 mod 元素级的求模计算 NumPy的ndarray 快速的元素级数组函数 • 二元函数 II 类型 说明 copysign 将第二个数组中的符号复制给第一个数组中的值 greater, greater_equal, less,less_equal,equal, not_equal 执行元素级的比较,最终产生布尔型数组。 logical_and, logical_or,logical_xor 执行元素级的真值逻辑运算,最终产生布尔型数组 ''' import numpy as np import numpy.random as np_random print('求平方根') arr = np.arange(10) print(arr) print(np.sqrt(arr)) print('数组比较') x = np_random.randn(8) y = np_random.randn(8) print(x) print(y) print(np.maximum(x,y)) print('使用modf函数把浮点数分解成整数和小数部分') arr = np_random.randn(7)*5 print(np.modf(arr))