Python(10) Numpy操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/irving512/article/details/78119246

0. 参考资料


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_like
b = 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可以为空,默认1
a = np.array([0,1,2,3,4,5,6,7,8,9])
a[1:8:3]
# 输出array([1, 4, 7])

# 拼接
## 参考手册 3.2.6 Joining arrays
a = 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 + 1
c = a ** 2
c = (a == 1)
c = (a > 1)

# Numpy对象间,基本操作符(要求两个对象的shape一致)
c = a + b
c = a ** b
c = (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必须为True
np.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,需要拆分的子对象数量
# axis
a = 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:需要比较的数组,类型(经过广播后)必须相同。

猜你喜欢

转载自blog.csdn.net/irving512/article/details/78119246