Python(10) Numpy操作

来源:互联网 发布:dedecms tag 数据库 编辑:程序博客网 时间:2024/06/09 06:34

0. 参考资料

  • Numpy官方文档

1. 创建矩阵

# 更多请参考Numpy手册 3.1 Array creation routines# 通过已有的python多维数组构建Numpy对象a = [[[1,2,2],[3,4,4]]]b = np.array(a)b.shape# 三维数组# 输出(1,2,3)# 直接调用np.array方法创建(可以创建多维数组)b = np.array([1,2,3])b.shape# 输出(3,),表明是一位数组,长度为3# arange()方法创建顺序数组b = np.arange(0,10,2)# 输出 array([1,3,5,7,9])# eye()方法创建对角线元素为1的矩阵b = np.eye(2,3)# 输出#array[[1, 0, 0],#[0, 1, 0]]# empty & empty_like方法# 数据不一定是0(或者说,一般都不是0)b = np.empty([3,4])c = np.empty_like(b)# ones & zeros & zeros_likeb = np.ones([1,2])c = np.zeros([3,4])d = np.zeros_like(b)# identity 单位方阵b = np.identity(3)# 随机数组/矩阵b = np.random.rand(3,2)

2. 数据分片与拼接

# [start:stop:step],不包括stop所指向的数# 索引从0开始计数# start stop step都可以是负数,有相应规则# start可以为空,表示从0开始# stop可以为空,表示到最后一个数为止(包括最后一个数)# step可以为空,默认1a = np.array([0,1,2,3,4,5,6,7,8,9])a[1:8:3]# 输出array([1, 4, 7])# 拼接## 参考手册 3.2.6 Joining arraysa = np.random.rand(3,2)b = np.random.rand(3,2)## 行增加,列不变np.concatenate((a,b),0)## 列增加,行不变np.concatenate((a,b),1)# 分片a = np.random.rand(4,3)## 获取某一行/列a[:,1] # 结果是数组(不是4*1维向量)a[:,1:2] # 结果是4*1维向量## 获取连续行/列a[:,1:3] # 不包括end## 获取不连续行/列## 注意,使用元组与列表都可以a[:,(0,2)]a[[0,3],:]

3. Element Wise Operation

a = np.ones([1,3])b = np.zeros([1,3])# Numpy对象与常数之间,基本操作符c = a + 1c = a ** 2c = (a == 1)c = (a > 1)# Numpy对象间,基本操作符(要求两个对象的shape一致)c = a + bc = a ** bc = (a == b)# Numpy提供的函数# 具体请参考手册 2.8 Available ufuncs# 可以是Numpy对象与常数,也可以是两个numpy对象c = np.log(a)c = np.sin(a)

4. 线性代数操作

# 矩阵乘法x.dot(y)# 其他参考numpy.linalg

5. 获取索引

5.1. np.flatnonzero

# 输入一个ndarray对象(维度任意),先讲ndarray对象转换为向量,再返回所有非0元素的索引# numpy.flatnonzero(a)# Return indices that are non-zero in the flattened version of a.# This is equivalent to a.ravel().nonzero()[0].a = np.array([1,0,2,0,0])b = np.array([[1, 0],[0, 1]])np.flatnonzero(a) # [0, 2]np.flatnonzero(b) # [0, 3]

5.2. np.argsort

# 返回的是数组值从小到大的索引# numpy.argsort(a, axis=-1, kind='quicksort', order=None)[source]# a array# axis 需要操作的轴,默认为-1# kind 排序类型,{‘quicksort’, ‘mergesort’, ‘heapsort’},默认快排# order 如果数组中每个元素都有属性,则可以通过该字段来确定属性排序优先级x = np.array([3, 1, 2])np.argsort(x) #升序排列np.argsort(-x) #降序排列

6.3. numpy.argmax

# 选择最大的数值元素的索引# numpy.argmax(a, axis=None, out=None)

6. 获取数据

6.1. np.random.choice

# 随机获取给定一维narray对象中的若干数据# numpy.random.choice(a, size=None, replace=True, p=None)# Generates a random sample from a given 1-D array# a,必须是一维narray对象# size,需要获取的元素数量(可以大于a的size,但此时replace必须为True)# replace,是否可以有重复(True可以有,False不能有)# p,各元素获取的概率(要求和必须为1)a = np.array([0, 1, 2, 3, 4])np.random.choice(a, 2) # 随机选择两个不重复的元素np.random.choice(a, 2, replace=True) # 随机选择2个元素,可能重复np.random.choice(a, 8, replace=True) # 随机选择8个元素,要求replace必须为Truenp.random.choice(a, 8, replace=True,p=[0.9, 0.1, 0, 0, 0]) # 随机选择8个元素,其概率为p

6.2. numpy.array_split

# 将给定的narray对象平均分为若干子对象(如果不能平均分配也不会报错)# numpy.array_split(ary, indices_or_sections, axis=0)# ary,整数或一维数组#      整数时,子对象数量。#      一维数组时,表示切片范围,如[2,3]表示数组范围为[:2] [2:3] [3:]#      取值可以不等于ary的长度,此时有些子数组可能为空,或不到要求的元素数量,或超过要求数量# indices_or_sections,需要拆分的子对象数量# axisa = np.array([0, 1, 2, 3, 4, 5])np.array_split(a, 3) # [array([0, 1]), array([2, 3]), array([4, 5])]np.array_split(a, 8) # [array([0]), array([1]), array([2]), arr], dtype=int32), array([],dtype=int32)]np.array_split(a, [2,5]) # [array([0, 1]), array([2, 3, 4]), array([5])]np.array_split(a, [1,2,3,4]) # [array([0]), array([1]), array([2]), array([3]), array([4, 5])]

0.其他

0.1. 类型转换

# 使用astype进行转换a = np.array([1, 2, 3])b = a.astype(np.float64)

0.2. where

# 类似于 x if condition else y的矢量化版本np.where(arr > 0, arr, 0)

0.3. axis

# 在很多操作中axis都存在,表示轴向操作# axis的取值范围是[0, array.ndim)# 我的理解就是,axis与shape对应# 若shape为(4, 3, 2),axis为1,则操作结果就是返回(4, 2)对象arr = np.random.randn(4, 3, 2)np.sum(arr, axis=0) # 3*2对象

0.4. numpy数组对象

arr = np.random.randn(4, 3, 2)# shape,维度,结果为(4,3,2)# ndim,维数,结果为3# size,元素数量,结果为24# dtype,元素类型

0.5. 转置

# np.transpose方法# 如果参数为空,则为普通转置# 参数为[0, array.ndim)的列表,不能重复# 转置结果可以从数组索引来看arr = np.random.randn(4, 3, 2)arr.transpose((2, 0, 1))# 例如,经过以上操作,原本索引为(0,1,2)的元素,现在的索引为(2, 0, 1)# 原本索引为(2, 1, 1)的元素,现在索引为(1, 2, 1)## np.T属性arr.T

0.6. np.bincount

# 获取输入数组中,每个数字的出现次数# 输出数组的长度等于输入数组中最大的元素取值+1# np.bincount(x, weights=None, minlength=0)# x,一维、非负整数 数组# weights, 与x的shape相同,out[n] += weight[i]# minlength 输出数组长度最小值np.bincount(np.arange(5))np.bincount(np.array([0, 1, 1, 3, 2, 1, 7]))

0.7. np.max与np.maximum

# np.max 获取最值# Return the maximum along a given axis.# np.maximum 比较并取最值# Element-wise maximum of array elements.# numpy.maximum(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj])# x1, x2:需要比较的数组,类型(经过广播后)必须相同。

原创粉丝点击