# -*- coding: utf-8 -*- """ Created on Wed Dec 22 13:11:41 2021 @author: hzh """ import numpy as np # 导入numpy库 import pandas as pd from pandas import DataFrame # 创建ndarray数组 # 一维数组 data1 = [6, 7.5, 8, 0, 1] # 列表 arr1 = np.array(data1) print(arr1.ndim) arr2 = np.array((5.6, 6.7, 7.8, 8.9, 9.)) # 元组 print(arr2) # pandas series print('pandas series') df1 = pd.Series(data1) print(df1) print(df1.values) print((df1.values).ndim) df2 = df1.values.reshape(1, -1) print(df2) print(df2.ndim) print(df2[0]) print(df2[0, 0]) # print(df1.values.reshape(1,-1)) # 二维numpy数组 import numpy as np data1 = [[6, 7.5, 8, 0, 1], [3.2, 3, 7, 52, 23.4]] arr1 = np.array(data1) print(arr1) print(arr1.shape, arr1.ndim, arr1.dtype, arr1.size) # pandas DataFrame print('pandas DataFrame') arr2 = pd.DataFrame(data1) print(arr2.values) print(arr2.shape, arr2.ndim, arr2.size) print(arr2[0]) # 显示0列数据 print(arr2.loc[0]) # 显示0行数据 print(arr2.iloc[0, 0]) # 显示0行0列数据 # reshape(),astype() import numpy as np arr1 = np.array([1, 2, 3, 4, 5, 6]) # 6个元素的一维数组 arr1 = arr1.reshape(2, 3) # 改变为:2行3列的二维数组 print(arr1) arr2 = arr1.astype(str) # 转换成字符型 print(arr2) # 自动创建数组1 print(np.ones(6)) print(np.zeros(6).reshape(2, 3)) print(np.arange(2, 10, 2)) print(np.linspace(2, 13, 12)) # 创建随机数组 np.random.seed(100) # 生成2行3列的随机数数组,值在[0,1)之间 n1 = np.random.rand(2, 3) print(n1) # 生成2行3列的随机数数组,值为正态分布的随机样本数 n2 = np.random.randn(2, 3) print(n2) # 生成包含10个元素的值在[0,100) 的数组 n3 = np.random.randint(0, 100, 10) print(n3) # 生成2*3维的值在[0,100) 的数组 n4 = np.random.randint(0, 100, (2, 3)) print(n4) # 通过文件读取保存数组 import numpy as np arr1 = np.arange(10) np.savetxt('2.txt', arr1, fmt='%0.4f', delimiter=',') arr2 = np.loadtxt('2.txt') print(arr2) # 访问数组元素 # 用下标访问元素1 x = np.array([1, 2, 3, 4, 5, 6]) print(x[4]) # 一维数组,访问第4个元素(从0开始计数) x = np.array([[1, 2, 3], [4, 5, 6]]) print(x[1]) # 二维数组,访问第1行数据(从0开始计数) # 列表切片2 arr = np.arange(10) print(arr) print(arr[5: 8]) arr[5: 8] = 12 # 值的广播 print(arr) # 数组的切片不是一个新的数组,是数组的一个视图 arr = np.arange(10) arr_slice = arr[5:8] # 获得一个视图而不是新的数组 arr_slice[1] = 32 print(arr) # 通过切片获得新数组的方法:copy() arr = np.arange(10) arr_slice = arr[5:8].copy() arr_slice[1] = 32 print(arr) # 访问高维数组元素, 切片不改变维度 arr1d = np.array([[1, 2, 3], [4, 5, 6]]) print(arr1d) print(arr1d[1, 2]) # 等价于print(arr1d[1][2]) print(arr1d[1]) # 数组子集(也是视图) print() arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(arr2d) print(arr2d[:2]) # 在轴0上切片 print(arr2d[:2, 1:]) # 在轴0和轴1上切片 print() arr3d = np.array([[1, 2, 3], [4, 5, 6]]) print(arr3d[1, :2]) # 轴0选第一行,然后在轴1上切片 print(arr3d[:, 1]) # 轴0全选,然后选取第1列 # print(arr3d) # 列表索引(花式索引)获得的是新数组,不是视图 import numpy as np arr2d = np.linspace(1, 100, 12).reshape(4, 3) print(arr2d) print(arr2d[[2, 0, 1]]) # 依次选取轴0的2,0,1行 print(arr2d[:, [2, 0]]) # 依次选取轴1的2,0列 # print(arr2d) # 布尔索引 arr2d = np.array([[1, -2, 3], [-4, 5, 6]]) print(arr2d) print(arr2d < 0) # arr2d<0 是个布尔型数组 print(arr2d[arr2d < 0]) # 用布尔型数组来索引 arr2d[arr2d < 0] = 0 # 赋值 print(arr2d) # numpy的基本运算:标量,向量和矩阵 # 广播运算 data1 = [[6, 7.5, 8, 0, 1], [3.2, 3, 7, 52, 23.4]] arr1 = np.array(data1) arr1 = arr1 * 2 # 这是广播运算 print(arr1) # print(1/arr1) # print(arr1**0.5) # 标量运算 print(np.sum([1, 2, 3, 4])) print(np.sqrt(100)) print(np.abs(-10)) # 向量运算 lst = [[6, 7.5, 8, 0, 1], [3.2, 3, 7, 52, 23.4]] arr2d = np.array(lst) print(arr2d) print(np.sum(arr2d)) print(np.min(arr2d, axis=1)) # 求每一行中的最小值,向量 print('*' * 20) np.mean(arr2d, axis=0) # 求每一列的平均值,向量 # 矩阵运算函数diag(),dot(),trace(),det().... import numpy as np A = np.array([[m + n for m in np.arange(4)] for n in np.arange(4)]) # 4 x 4 2D arrays B = np.array([[m - n for m in np.arange(3)] for n in np.arange(4)]) # 4 x 3 2D arrays C = np.arange(4) # 1D vector with a size of 4 # A, B, C print(A) print(B) print(C) print(A.shape) print(B.shape) print(C.shape) # 计算矩阵相乘 print(np.dot(A, B), '\n') print(np.dot(A, C)) print(np.dot(C, A)) # 数学上的矩阵相乘 """ 练一练: 1、用arange()生成一个0-20以内,5行4列的A数组 2、将A数组元素保存在arr1.txt文件中,保存格式为%4d,以逗号作为分隔符 3、访问A数组,输出数组的0行最后一个元素 4、访问A数组,分别输出数组的第2,3行的数据,第3,4列的数据 5、访问A数组,分别输出数组的轴0方向全选,轴1方向输出第2,3列元素 6、访问A数组,输出行选取第一行和最后一行,列选取0,3,2列显示 7、将A数组中所有的奇数变成其平方数输出 8、求出所有数据、每一行和每一列的平均值并输出 """