NUMPY学习
import numpy as np
import matplotlib.pyplot as plt
def numpy_sum(n):
a = np.arange(n) ** 2
b = np.arange(n) ** 3
return a+b
#print(numpy_sum(10))
x = np.array(
[
[1,2,3],[4,5,6]
]
)
#print(x)
#arange(开始,结束,步长)
x.shape,x.ndim,x.size,x.dtype
###创建array快捷函数
a = np.ones(2)#一维
b = np.ones((2,3))#多维
d = np.zeros(1)
e = np.empty(1)#全是0,但是运行时全是随机数
c = np.ones_like(a)#创建形状相同的
a = np.full((2,4),66)
#创建一个(2,4),里面的值全是66
#随机产生一个3*2的矩阵
a = np.random.randn(3,2)
#这样产生一个数组,还可将其形状改变
b = np.arange(10).reshape(2,5)
a+1
a*3
a = np.sin(a)
#从第三个到最后一个,不包括最后一个
a[2:-1]
####Numpy经常要处理大数组,避免每次都复制
x = np.arange(10)
x[1:4] = 666
#print(x)
###神奇索引
#print(x[[3,4,7]])
x = x.reshape(2,5)
####应用 获取数组中最大的前N个数字
arr = np.random.randint(1,100,10)
#print(arr)
#随机产生10个随机数 从1-100
index= arr.argsort()[-3:]
#argsort会返回排序之后的索引index,取最大值对应的3个下标
#print(arr[arr.argsort()[-3:]])
### 二维数组
x = np.arange(20).reshape(4,5)
#筛选行,列可以省略
x[[0,2]]
#筛选列,行不可以省略
x[:,[2,3]]
### 布尔索引
x = np.arange(10)
x>5
#前面返回 false,后面返回true
x[x<5]+=20
#前五个加20
#在二位数组上的表现
x = np.arange(20).reshape(4,5)
x[x>5]
#由于 x>5是bool数组,因此返回的是一维结果
x[:,3]>5
#将第三列大于5的
x[x[:,3]>5]
x[2]#取出第二行
#如果第三列有数字》5就将此行取出,这里是按行取出来
###a[size,replace,p]
a = np.random.choice(5,3)
a = np.random.choice(5,(2,3))
#随机在 【】中生成3个数字
a = np.random.choice([2,3,6,7,9],3)
a = np.random.choice([2,3,6,7,9],(2,3))
#随机生成一个矩阵
###把一个数组x进行随机排列
a = np.arange(10)
np.random.shuffle(a)
#print(a)
#如果数组是多维的,则只会在第一个维度打散数据
#只会按行打散
###把一个数组x进行随机排列,或者数字的全排列
a = np.random.permutation(10)
arr = np.arange(9).reshape((3,3))
#print(arr)
#这里不会更改原来的arr,会返回一个新的copy
arr1 = np.random.permutation(arr)
#按第一维打乱
#print(arr1)
#正态分布 平均值 方差 size(3,4)
np.random.normal(1,10,10)
#
###例子:对数组加随机噪声
###绘制sin曲线
#最小-10 最大10 生成100 个点
x = np.linspace(-10,10,100)
y = np.sin(x)
#x与y都一一对应
#plt.plot(x,y)
#plt.show()
###加入噪声
x = np.linspace(-10,10,100)
#np.random.rand(len(x))均匀分布 len(x)生成维度与x是一样的
y = np.sin(x)+np.random.rand(len(x))
#plt.plot(x,y)
#plt.show()
###
arr = np.arange(12).reshape(3,4)
arr1 = arr.sum(axis = 0)
##axis = 0将行消解掉,axis =1 将列消解掉
#print(arr)
####实例 机器学习将数据进行标准化
#arr
#计算每一列的均值
mean = np.mean(arr,axis=0)
#不同列代表不同特征,所以逐列进行计算
#计算每一列的方差
std =np.std(arr,axis = 0)
#计算分子,注意每行都会分别减去【4,5,6,7】,这叫做广播
fenzi = arr - mean
#print(fenzi)
result = fenzi/std
###用标准式子
result = (arr - np.mean(arr,axis=0)) /np.std(arr,axis = 0)
#(x - 均值)/方差 标准化
###numpy计算数组中满足条件元素的个数
###需求 一个1亿的数字,求出数字中<5000的数字数目
#生成这个1亿数字
arr = np.random.randint(1,10000,size = int(1e8))
#print(arr.size)
#使用python原生语法实现
pyarr = list(arr)
#len返回对象的长度
len([x for x in pyarr if x>5000])
#记录时间
###使用numpy的向量化进行操作
arr[arr>5000].size
#传入条件,这是numpy支持的布尔索引
(arr>5000)[:10]
ar = np.arange(10)
#方法一,给以为向量添加一个行维度
ar[np.newaxis,:]
#这个ar形状为 1,5
#方法二,添加一个行维度
np.expand_dims(ar,axis = 0)
#方法三
np.reshape(ar,(1,5))
#按行或者按列合并
a = np.arange(3).reshape(2,3)
b = np.random.randint(10,20,size = (4,3))
#1
np.concatenate([a,b])
np.concatenate([a,b],axis = 1)
#2
np.vstack([a,b])
np.hstack([a,b])
#3
np.row_stack([a,b])
np.column_stack([a,b])