赞
踩
numpy全称是numerical python,是python中用于数值计算最重要的包。它可以用于进行快速的矩阵运算、线性代数、随机数生成和傅里叶变换。
它比python计算列表计算更快,占用内存更少。这是因为numpy是以数组为粒度进行计算的,而python要用for循环来计算。
numpy是scipy, pandas, scikit-learn, tensorflow等框架的底层语言。
我们先来看看numpy中的数据类型:
array本身的属性
arr.ndim # 维数
arr.shape # 维度,(行,列)
arr.size # 元素的个数
arr.dtype # 元素类型
创建数组
# 列表创建
arr = np.array([1,2,3],dtype=np.int8)
# 函数创建
arr = np.arange(start,stop,step,dtype)
arr = np.linspace(start,stop,steps)
arr = np.eye(size) # size可以是int或元组
arr = np.diag(arr) # 如果arr是一维的,那么将生成一个对角矩阵,如果arr是二维的,那么将取对角线上的元素组成一维数组
arr = np.diag([1,2,3],1) # 对角线往上挪了一格,相当于生成4*4的矩阵
np.zeros(size)
np.zeros_like(arr)
np.ones(size)
np.ones_line(arr)
np.empty(size)
np.empty_like(arr)
np.random.randn((2,3))
数组的索引、切片、赋值和复制
import numpy as np # 索引,切片 arr = np.arange(10) print(arr[5]) print(arr[5:8]) arr[5:8] = 12 print(arr) # 赋值 arr_slice = arr[5:8] print(arr_slice) arr_slice[1] = 12345 # arr_slice改变,arr也会改变,这并没有复制 print(arr) # 复制 arr = np.arange(10) print(arr) arr_slice = arr[5:8].copy() # 复制,arr_slice改变,arr不会改变 print(arr_slice) arr_slice[1] = 64 print(arr) # 二维数组的索引 arr = np.array([[1,2,3],[4,5,6],[7,8,9]]) # 两种方法 print(arr[0,2]) print(arr[0][2])
数组的转置和换轴
arr = np.arange(15).reshape((3,5))
print(arr)
print(arr.T) # 转置
# 换轴
arr = np.arange(16).reshape((2,2,4))
print(arr)
arr = arr.transpose((1,0,2))
print(arr)
random
import numpy as np np.random.seed(666) # rand np.random.rand(5) np.random.rand(3,4) np.random.rand(2,3,4) # randn np.random.randn(5) np.random.randn(3,4) np.random.randn(2,3,4) # randint np.random.randint(3) np.random.randint(1,10) np.random.randint(10,30,size=(5,)) np.random.randint(10,30,size=(2,3,4)) # random np.random.random(5) np.random.random(size=(3,4)) np.random.random((2,3,4)) # choice() np.random.choice(5,3) # a是数字,则从range(5)中生成,size为3 np.random.choice(5,(2,3)) np.random.choice([2,3,6,7,9],3) # a是数组,从里面抽取出3个数字 np.random.choice([2,3,6,7,9],(2,3)) # shuffle(x) a = np.arange(10) result = np.random.shuffle(a) a = np.arange(20).reshape(4,5) np.random.shuffle(a) # 只在第一维度进行打散,列的顺序不会改变,在原始数组上操作,不返回值 # permutation(x) np.random.permutation(10) arr = np.arange(9).reshape((3,3)) result = np.random.permutation(arr) # 只在第一维度进行打散,列的顺序不会改变,不改变原来数组,返回一个新数组 # normal() np.random.normal(1,10,10) np.random.normal(1,10,(3,4)) # uniform() np.random.uniform(1,10,10) np.random.uniform(1,10,(3,4)) # 实例:对数组加入随机噪声 x = np.linspace(-10,10,100) y = np.sin(x) plt.plot(x,y) y1 = np.sin(x) + np.random.rand(len(x)) plt.plot(x,y) plt.show()
数学统计函数
给数组增加维度
# 三种方法 # np.newaxis关键字 arr = np.arange(5) print(arr.shape) arr = arr[:,np.newaxis] print(arr) # np.expand_dims(arr,axis) arr = np.arange(5) print(arr) arr = np.expand_dims(arr,axis=0) print(arr.shape) # np.reshape(arr,newshape)) arr = np.arange(5) print(arr.shape) arr = np.reshape(arr,(1,-1)) print(arr.shape)
数组合并
# np.concatenate(array_list,axis) 沿着指定axis进行数组的合并 a = np.arange(6).reshape(2,3) b = np.random.randint(10,20,size=(4,3)) result = np.concatenate([a,b],axis=0) print(result) # np.vsatck或np.row_stack(array_list) 垂直\按行进行数据合并 result = np.vstack([a,b]) print(result) result = np.row_stack([a,b]) print(result) # np.hstack或np.column_stack(array_list) 水平\按列进行数据合并 a = np.arange(12).reshape(3,4) b = np.random.randint(10,20,size=(3,2)) result = np.hstack([a,b]) print(result) result = np.column_stack([a,b]) print(result)
数组分割
import numpy as np
arr = np.arange(12).reshape(3,4)
print(arr)
print(np.split(arr,2,axis=1))
print(np.split(arr,3,axis=0))
# print(np.split(arr,3,axis=1)) # 报错,np.split只能进行等分
print(np.array_split(arr,3,axis=1)) # 可以进行不等分
print(np.vsplit(arr,3)) # 横向分割,也就是按行分割
print(np.hsplit(arr,2)) # 纵向分割,也就是按列分割
数组的通函数
# * 按元素相乘 a = np.array([[1,1],[0,1]]) b = np.array([[2,0],[3,4]]) result = a*b print(result) # dot 矩阵乘积 result = a.dot(b) print(result) # np.exp(arr) # np.sqrt(arr) # np.add(arr1,arr2) # np.all(a,axis) 检查指定axis上是否全为True # np.any(a,axis) 检查指定axis上是否存在True # np.argmax(a,axis) 返回指定axis上的最大元素的索引 # np.argmin(a,axis) 返回指定axis上的最小元素的索引 # np.argsort(a,axis) 返回指定axis上的从小到大排列的索引 x = np.array([3,1,2]) result = np.argsort(x) print(result) # array([1,2,0]) # np.sort(a,axis) 返回指定维度上的按照从小到大排列的数组 # np.ceil(a) # np.floor(a) # np.clip(a,a_min,a_max) a = np.arange(10) print(a) result = np.clip(a,1,8) print(a) # np.cross(a,b) 返回两个矩阵的向量积 # np.minimum(x1, x2[, out]) 返回两个数组的较小值组成的数组 # np.maximum(x1, x2[, out]) 返回两个数组的较大值组成的数组 # np.flipud(a) 对矩阵进行上下翻转 # np.argwhere(a) 返回符合条件的数组的索引 >>> x = np.arange(6).reshape(2,3) >>> x array([[0, 1, 2], [3, 4, 5]]) >>> np.argwhere(x>1) array([[0, 2], [1, 0], [1, 1], [1, 2]])
文件读写
# np.fromfile(file, dtype=float, count=-1, sep='', offset=0) 从文本或二进制文件中的数据构造一个数组。使用tofile方法写入的数据可以使用此函数读取。
# file:打开文件对象或文件名。file 或 str 或 Path。
# dtype:返回数组的数据类型。
# count:要读取的字符或字节数。-1表示所有字符或字节(即完整文件)。
# sep:如果文件是文本文件,则字符之间的分隔符。
# offset:与文件当前位置的偏移量(以字节为单位)。默认值为0。仅允许用于二进制文件。
内存管理
# np.ascontiguousarray(a, dtype=None):将一个内存不连续存储的数组转换为内存连续存储的数组,使得运行速度更快。
逻辑运算
# np.logical_and(x1, x2):返回X1和X2与逻辑后的布尔值。
# np.logical_or(x1, x2):返回X1和X2或逻辑后的布尔值。
# np.logical_not(x):返回X非逻辑后的布尔值。
# np.logical_xor(x1,x2):返回X1和X2异或逻辑后的布尔值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。