Numpy科学计算
1.Arrays
array用来存储同类型的序列数据,能够被非负整数进行索引。 维度的数量就是array的秩(rank)。
我们可以通过python的列表来创建array,并且通过方括号进行索引获取元素
最常用的就是np.array()
#创建array时加入数据类型参数
np.array([[1,2,3],[4,5,6],[7,8,9]],np.int64)
##自定义数据类型 ,适用场景少
#np.dtype语法
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student)
a[0].dtype
创建一些特殊的数组:
np.zeros(3) 创建3个为0的数列
np.ones([3,3]) 创建为1
np.zeros_like(b) zeros告知程序数组里面存的还是0,like(b)是指shape也就是形状和b是一样的
np.eye() 单位矩阵数组:在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵.它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素均为1以外全都为0。
2.常用的属性和方法:
a=np.random.rand(3,4) 随机数,产生3行4列
a.size() 算有多少个元素
np.sum(a) 对所有元素加起来
np.sum(a,axis=0) 对列求和
np.sum(a,axis=1) 对行求和 比如mean() std()都会有轴的选取
a.sum(axis=0)
np.cumsum(a,axis=1)#累加,按行
排序:
np.sort(a,axis=0)
np.argmax(a,axis=0) 返回最大值的索引并且在轴上。 非常常用!!! (要加axis啊朋友!)
a.argsort() 在每一行里面单独进行排序,返回的是索引!
np.where():
不设置值,默认返回的是索引。
np.where(b>4,-1,1) 满足条件的返回-1,不满足返回1
numpy.extract() 函数根据某个条件从数组中抽取元素,返回满条件的元素
a = np.array([[8,7],[9,1],[3,2]])
# 定义条件, 选择偶数元素
condition = (np.mod(a,2) == 0)
np.extract(condition, a)
复制
浅拷贝array.copy()
浅拷贝与深拷贝:https://zhuanlan.zhihu.com/p/25221086
直接复制a=b,算是深拷贝,改动b,a也会受影响。
浅拷贝需要用 a=b.copy
3.改变数组的形状
一个数组的 shape 是由轴及其元素数量决定的,它一般由一个整型元组表示,且元组中的整数表示对应维度的元素数
a = np.arange(8)
# 修改成4行2列的
a = a.reshape(4,2)
#进行转置
a.T
多维变成一维:
# numpy.ravel() 展平的数组元素
#order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'K' -- 元素在内存中的出现顺序。
np.ravel(a,order='K')
import numpy as np
a = np.random.randint(1,100,size =(5,6))
a.shape
一个数组的 shape 可以由许多方法改变。例如以下三种方法都可输出一个改变 shape 后的新数组,它们都不会改变原数组。其中 reshape 方法在实践中会经常用到,因为我们需要改变数组的维度以执行不同的运算。
a.ravel() 把数组变成1维的
a.flatten()
ravel() 和 flatten() 都是将多维数组降位一维,flatten() 返回一份新的数组,且对它所做的修改不会影响原始数组
a.T 转秩,横轴,竖轴交换
a.reshape(10,3) 任意调整你想的形状,但是元素总数不能变
a.reshape(10,-1)如果在 shape 变换中一个维度设为 - 1,那么这一个维度包含的元素数将会被自动计算。如下所示,a 一共有 30 个元素,在确定一共有 3 行后,-1 会自动计算出应该需要 10 列才能安排所有的元素。
4.随机数
常用的一些方法:
rand(d0, d1, …, dn) Random values in a given shape.
randn(d0, d1, …, dn) Return a sample (or samples) from the “standard normal” distribution.
randint(low[, high, size, dtype]) Return random integers from low (inclusive) to high (exclusive).
random([size]) Return random floats in the half-open interval [0.0, 1.0). 返回0-1之间的浮点数
sample([size]) Return random floats in the half-open interval [0.0, 1.0). 返回0-1之间的浮点数
choice(a[, size, replace, p]) Generates a random sample from a given 1-D array
np.rand() 返回0-1之间的数
返回符合标准正太的数
填入的参数是上限,
下面的是low,high,size
返回0-1之间的浮点数
第一个参数10 是指不超过10的数,然后随机选择(3,4)3行4列出来
第一个参数直接填入数组,然后随机选择出来符合(3,4)形状的数组
5.数组的索引选取
切片选取类似于list,但是array可以是多维度的,因此我们需要指定每一个维度上的操作
下面整数索引中,是一一对应的也就是1对0,2对1
返回的是一维的数组
上述绿色的 a[2::2,::2] 选择行是指从第二行开始步长为2到选择完。
x[n,:]表示在n个数组(维)中取全部数据,直观来说,x[n,:]就是取第n集合的所有数据
#查找前二行的所有数据的第三列
a[:2,2]
6.数组的计算
a = np.random.random([3,4])
b = np.random.random([3,4])
a+2
b*10 #里面每个元素都会进行计算,数组广播
# Elementwise 但是两个二维数组的格式必须是一样的根据索引的位置一一对应计算
a + b
a - b
a * b
a / b
a[a>b] #取值
最好用下面方式,更加代码化
np.add(a,b)
np.subtract(a,b)
np.multiply(a,b)
np.divide(a,b)
取.后面前三个字母即可
#矩阵合并
a = np.arange(1, 4)
b = np.arange(4, 7)
#垂直合并,列数必须相等
np.vstack((a, b))
#水平合并,行数必须相等
np.hstack((a, b))
*是元素力度的计算(Elementwise),并不是矩阵计算。我们使用dot函数进行内积求解
矩阵计算第一个矩阵的列必须和第二个矩阵的行数是一致的!
# shape(a) = 3*4 shape(b.T) = 4*3
a.dot(b.T) # (3*4) * (4*3) = 3 * 3
np.dot(a,b.T)
补充:
中位数:np.median(num)
众数:
from scipy import stats
stats.mode(nums)[0][0]
7.np.array.any()和numpy.array.all()
np.array.any()是或操作,任意一个元素为True,输出为True。
np.array.all()是与操作,所有元素为True,输出为True。
if (df["DJ02"]=="-").any():
...
...
np.unique() 对列表进行计数。
a = [1,2,3,4,2,3,4]
np.unique(a,return_counts=True)
np.floor() 向下取整
np.ceil() 向上去整
#增删查改
增 np.append
语法:numpy.append(arr, values, axis=None)
arr:输入数组
values:要向arr添加的值,需要和arr形状相同(除了要添加的轴)
axis:默认为 None。当axis无定义时,是横向加成,返回总是为一维数组!当axis有定义的时候,分别为0和1的时候。当axis有定义的时候,1的时候(列数要相同)。当axis为1时,数组是加在右边(行数要相同)。
# 向轴0添加元素
np.append(a,[[7,8,9]],axis=0)
# 向轴1添加元素,用二维列表
np.append(a,[[7],[2]],axis=1)
插入
增 np.insert
语法:numpy.insert(arr, obj, values, axis)
arr:输入数组
obj:在其之前插入值的索引
values:要插入的值
axis:沿着它插入的轴,如果未提供,则输入数组会被展开
a = np.array([[1,2],[3,4],[5,6]])
#沿着axis=0轴进行数据插入
np.insert(a,1,[[11,11]],axis = 0)
#沿着axis=1轴进行数据插入
np.insert(a,1,[11,12,13],axis = 1)
删
numpy.delete(arr,obj,axis)
arr:输入数组。
obj:索引
axis:沿着它删除给定子数组的轴,如果未提供,则输入数组会被展开。
a = np.arange(12).reshape(3,4)
#删除第二列
np.delete(a,1,axis=1)
#删除第二行
np.delete(a,1,axis=0)
#删除第二和第三行
np.delete(a,(1,2),axis=0)
改
#修改第一行数据
a[0] = [11,22]