NumPy Study Notes ?? Download author : zoxiii
0、NumPy简介
??NumPy的前身为 Numeric,最早由Jim Hugunin与其它协作者共同开发,2005年,Travis Oliphant在Numeric中结合了另一个同性质的程序 Numarray的特色,并加入了其它扩展而开发了NumPy。
??Numerical Python 的简称,是Python科学计算的基础包,支持大量的维度数组与矩阵运算
NumPy官网
NumPy菜鸟教程
set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None)
常用参数:
- precision:控制输出的小数点个数,默认是8
- threshold:控制输出的值的个数,其余以…代替;
- 当设置打印显示方式threshold=np.nan,意思是输出数组的时候完全输出,不需要省略号将中间数据省略
- suppress: 当suppress=True,表示小数不需要以科学计数法的形式输出
import numpy as np
np.set_printoptions(precision=4, suppress=True)
0.1、数据类型ndarray
NumPy提供了一个N维数组类型ndarray,它描述了相同类型的“items”的集合。
-
以下标0开始; -
ndarray 中的每个元素在内存中都有相同存储大小的区域; -
numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行计算。 -
Numpy底层使用C语言编写,数组中直接存储对象,而不是存储对象指针,所以其运算效率远高于纯Python代码。 -
数组维度(dimensions)也叫做轴(axis),轴的数量就是数组的秩(rank) a.
[
1
,
2
,
3
,
4
]
[1,2,3,4]
[1,2,3,4]是
1
×
4
1\times4
1×4的数组 b.
[
[
0
,
1
,
2
]
,
[
3
,
4
,
5
]
]
[[0,1,2],[3,4,5]]
[[0,1,2],[3,4,5]]是
2
×
3
2\times3
2×3的数组,它是二维的,第一个维度长度为2,第二个维度长度为3
c. 很多时候可以声明axis
-
i. axis=0,表示沿着第0轴进行操作,即对每一列进行操作。
-
ii. axis=1,表示沿着第1轴进行操作,即对每一行进行操作。
1、数据生成
1.1、将已有list数据变为ndarraynp.array()
data = [1,2,3]
arr1 = np.array(data)
arr2 = np.array([[1,2,3],
[4,5,6],
[7,8,9],
[10,11,12]])
print(f'一维数组: \n {arr1} \n\n 多维数组: \n {arr2} \n')
arr3 = np.array([1.1,2,3],dtype=np.float64)
print(f'数据类型为 {arr3.dtype} 的一维数组:{arr3}')
output:
print(arr2.ndim)
print(arr2.shape)
print(arr2.size)
print(arr2.dtype)
output:
1.2、产生整数变量np.arange()
print(np.arange(15),end="\n\n")
print(np.array([x for x in range(15)]),end="\n\n")
print(np.arange(2,15),end="\n\n")
print(np.arange(2,15,2),end="\n\n")
print(np.arange(2,15,1.5),end="\n\n")
output:
1.3、常用矩阵
a = np.zeros((2,3))
b = np.empty(10)
c = np.ones(10)
d = np.identity(2)
e = np.eye(3,4)
print(a,'\n\n',b,'\n\n',c,'\n\n',d,'\n\n',e)
output:
1.4、产生随机数组
np.random.normal(loc,scale,size) 正态分布随机数(均值、方差、大小)- seed,permutation,shuffle,rand,randit,randn,vinomial,normal,beta,chisquare,gamma,uniform等
arr = np.random.normal(size=(4, 4))
print(arr, '\n')
from numpy.random import randn
arr = randn(2, 3)
print(arr)
output:
import random
x = random.uniform(0,1)
x
output:
2、数据选取
2.1、索引
- 简单的下标索引
arr = np.arange(10)
arr[5]
output:
- 利用布尔值索引
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = randn(7, 4)
print(names,'\n')
print(data,'\n')
print(names == 'Bob','\n')
print(data[names == 'Bob'],'\n')
print(data[names == 'Bob', 3],'\n')
print((names == 'Bob') | (names == 'Will'),'\n')
print(data[data<0],'\n')
output:
- 其他索引
arr = np.empty((8, 4))
for i in range(8):
arr[i] = i
print(arr,'\n')
print(arr[[4, 3, 0, 6]],'\n')
print(arr[[-3, -5, -7]],'\n')
output:
arr = np.arange(32).reshape((8, 4))
print(arr,'\n')
print(arr[::-1],'\n')
print(arr[:,2::-1],'\n')
print(arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]],'\n')
print(arr[[1, 5, 7, 2], [0, 3, 1, 2]],'\n')
output:
2.2、切片
arr = np.arange(10)
b = arr[5:8]
b[0] = 11111
print(b,arr)
lis = [0,1,2,3,4,5,6,7,8,9]
c = lis[5:8]
c[0] = 11111
print(c,lis)
output:
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2d[1],end='\n\n')
print(arr2d[:][1],end='\n\n')
print(arr2d[:,1],end='\n\n')
print(arr2d[:,0:2],end='\n\n')
print(arr2d[:,[0,1]],end='\n\n')
print(arr2d[0][2],end='\n\n')
print(arr2d[0,2],end='\n\n')
print(arr2d[0:2,0:2],end='\n\n')
b = arr2d[0]
b[:] = 10
arr2d
output:
3、数据处理
3.1、改变数组维度arr.reshape()
arr = np.array([[1,2],
[3,4],
[5,6]])
arr.reshape(1,6).reshape(2,3)
output:
3.2、转换数组元素数据类型arr.astype()
arr = np.array([1,2,3])
arr.astype(np.float64)
output:
arr = np.array([1.1,2.2,3.3])
arr.astype(np.int32),arr.astype(np.str)
output:
3.3、数组转置arr.T
arr = np.array([[1,2,3],
[4,5,6]])
arr.T
output:
3.4、矩阵相乘np.dot()
- diag,dot,trace,det,eig,inv,pinv,qr,svd,solve,lstsq函数等
- numpy.linalg中有更多矩阵函数
arr = np.arange(15).reshape((3, 5))
np.dot(arr.T,arr)
output:
4、数据运算
4.1、加减乘除基本运算
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
print(arr + arr,end='\n\n')
print(arr - arr,end='\n\n')
print(arr * arr,end='\n\n')
print( 1 / arr,end='\n\n')
print(arr **0.5,end='\n\n')
output:
4.2、常用数学运算
np.sqrt() 求根号np.exp() 求指数函数值np.maximum() 两数组比较输出对应位置较大的值np.minimum() 两数组比较输出对应位置较小的值np.modf() 对浮点数数组得到整数和小数部分两个数组np.meshgrid() 使用数组值生成网格/坐标矩阵- 还有argmin,argmax,cumsum,cumprod等
arr = np.arange(10)
print(arr,'\n')
print(np.sqrt(arr))
print(np.exp(arr))
output:
x = randn(8)
y = randn(8)
print('x', x)
print('y', y,'\n')
print('max', np.maximum(x, y))
print('min', np.minimum(x, y), '\n')
print(np.modf(x),'\n')
output:
points = np.arange(-5, 5, 1)
p = np.arange(-4, 4, 1)
[x1, y1] = np.meshgrid(points,points)
[x2, y2] = np.meshgrid(points,p)
print(points,'\n', x1,'\n', y1, '\n\n')
print(x2,'\n', y2)
output:
4.4、常用统计运算
np.sum() 求和np.mean() 求平均值np.std() 求标准差np.var() 求方差np.cov() 求协方差np.max() 求最大值np.min() 求最小值
arr = randn(4,3)
print(f'二维数组:\n{arr}')
summ = np.sum(arr)
maxx = np.max(arr)
minn = np.min(arr)
print(f'arr求和:{summ}')
print(f'arr最大值:{maxx}')
print(f'arr最小值:{minn}')
average = np.mean(arr, axis = 0)
std = np.std(arr, axis = 0)
w_var = np.var(arr, axis = 0)
var = np.var(arr, axis = 0, ddof = 1)
cov = np.cov(arr, rowvar=False)
print(f'样本均值:\n{average}')
print(f'样本标准差:\n{std}')
print(f'总体方差:\n{w_var}')
print(f'样本方差:\n{var}')
print(f'各列之间的协方差:\n{cov}')
output:
其他
-
取二维数组某一列 arr[:,0] -
在某一数组后拼接数组 arr1.append(arr2) 或np.append(arr1,arr2) -
判断两个数组是否完全相等 (arr1 == arr2).all() -
判断两个数组是否存在相同元素 (arr1 == arr2).any() -
只复制数组数值,不传递地址 x = y.copy() 或x[:] = y[:] -
将多位整数切分成ndarray数组 a = 435748141 b = np.array(list(map(int,str(a))) -
判断一个变量是否是list类型 isindtance(a, int) -
对数组按列排序 arr.sort(0) -
输出数组中不同的元素 np.unique(arr) -
条件判断语句 np.where(cond, xarr, yarr) # if cond return xarr else return yarr
|