python随机获取数组元素_Python数据分析之NumPy数值计算NumPy 数值计算基础
Numpy简介
NumPy(Numerical Python)是Python的⼀种开源的数值计算扩展。这种⼯具可⽤来存储和处理⼤型矩阵,⽐Python⾃⾝的嵌套列表(nested list structure)结构要⾼效的多(该结构也可以⽤来表⽰矩阵(matrix)),⽀持⼤量的维度数组与矩阵运算,此外也针对数组运算提供⼤量的数学函数库 。
NumPy 是⼀个运⾏速度⾮常快的数学库,主要⽤于数组计算,包含:
·⼀个强⼤的N维数组对象 ndarray
·⼴播功能函数
·整合 C/C++/Fortran 代码的⼯具
·线性代数、傅⾥叶变换、随机数⽣成等功能
NumPy 数组对象 ndarray
数组对象 ndarray简介
NumPy 最重要的⼀个特点是其 N 维数组对象 ndarray,它是⼀系列同类型数据的集合,以 0 下标为开始进⾏集合中元素的索引。
ndarray 对象是⽤于存放同类型元素的多维数组。
ndarray 中的每个元素在内存中都有相同存储⼤⼩的区域。
ndarray 内部由以下内容组成:
·⼀个指向数据(内存或内存映射⽂件中的⼀块数据)的指针。
·数据类型或 dtype,描述在数组中的固定⼤⼩值的格⼦。
·⼀个表⽰数组形状(shape)的元组,表⽰各维度⼤⼩的元组。
·⼀个跨度元组(stride),其中的整数指的是为了前进到当前维度下⼀个元素需要"跨过"的字节数。
ndarray 的内部结构:
数组属性
ndarray(数组)是存储单⼀数据类型的多维数组
属性说明
ndim返回 int。表⽰数组的维数
shape返回 tuple。表⽰数组的尺⼨,对于 n ⾏ m 列的矩阵,形状为(n,m)
size返回 int。表⽰数组的元素总数,等于数组形状的乘积
dtype返回 data-type。描述数组中元素的类型
itemsize返回 int。表⽰数组的每个元素的⼤⼩(以字节为单位)。
数组创建
numpy.array(object, dtype=None, copy=True, order='K',subok=False, ndmin=0)
参数名称
object
linspace numpydtype
ndmin
代码案例
import numpy as np# 数组属性:ndarray(数组)是存储单⼀数据类型的多维数组。# 创建⼀维数组arr1 = np.array([1, 2, 3,
4])print("创建的数组为: ", arr1)# 创建⼆维数组arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [11, 22, 33]])print("创建的数组为:
\n", arr2)# 查看数组结构print("数组结构为 ", arr2.shape)# 查看数组类型print("数组类型为 ", arr2.dtype)# 查看数组元素个数
print("查看数组元素个数", arr2.size)# 查看数组每个元素⼤⼩print("查看数组每个元素的⼤⼩", arr2.itemsize)# 查看数组维度print("查看数组维度", arr2.ndim)# 重新设置数组的 shape 属性# 第⼀种写法arr2.shape = 2, 6print("重新设置shape维度的arr2: \n",
arr2)# 第⼆种写法arr2 = shape(4, 3)print("重新设置shape维度的arr2: \n", arr2)# 创建⼆维数组# 使⽤arange 函数创建数组print("使⽤arange函数创建数组为: \n", np.arange(0, 1, 0.1))# 使⽤linspace 函数创建数组print("使⽤linspace函数创建数组: \n", np.linspace(0, 1, 12))# 使⽤logspace 函数创建等⽐数列print("使⽤logspace函数创建的数组为: \n", np.logspace(0, 2, 20))# 使⽤zeros函数创建数组print("使⽤zeros函数创建数组:\n", np.zeros((2, 3)))# 使⽤eye函数创建数组print("使⽤eye函数创建数组: \n", np.eye(3))# 使⽤giag函数创建数组print("使⽤diag函数创建数组: \n", np.diag([1, 2, 3, 4]))# 使⽤ones函数创建数组print("使⽤ones 函数创建数组: \n", np.ones((5, 3)))
数组数据类型
名称描述
bool_布尔型数据类型(True 或者 False)
int_默认的整数类型(类似于 C 语⾔中的 long,int32 或 int64)
intc与 C 的 int 类型⼀样,⼀般是 int32 或 int 64
intp⽤于索引的整数类型(类似于 C 的 ssize_t,⼀般情况下仍然是 int32 或 int64)
int8字节(-128 to 127)
int16整数(-32768 to 32767)
int32整数(-2147483648 to 2147483647)
int64整数(-9223372036854775808 to 9223372036854775807)
uint8⽆符号整数(0 to 255)
uint16⽆符号整数(0 to 65535)
uint32⽆符号整数(0 to 4294967295)
uint64⽆符号整数(0 to 18446744073709551615)
float_float64 类型的简写
float16半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
float32单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
float64双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
complex_complex128 类型的简写,即 128 位复数
complex64复数,表⽰双 32 位浮点数(实数部分和虚数部分)
complex128复数,表⽰双 64 位浮点数(实数部分和虚数部分)
numpy 的数值类型实际上是 dtype 对象的实例,并对应唯⼀的字符,包括 np.bool_,np.int32,np.float32,等等。
数据类型对象 (dtype)
数据类型对象(numpy.dtype 类的实例)⽤来描述与数组对应的内存区域是如何使⽤,它描述了数据的以下⼏个⽅⾯::
·数据的类型(整数,浮点数或者 Python 对象)
·数据的⼤⼩(例如, 整数使⽤多少个字节存储)
·数据的字节顺序(⼩端法或⼤端法)
·在结构化类型的情况下,字段的名称、每个字段的数据类型和每个字段所取的内存块的部分
·如果数据类型是⼦数组,那么它的形状和数据类型是什么。
字节顺序是通过对数据类型预先设定 << span=""> 或 > 来决定的。 << span=""> 意味着⼩端法(最⼩值存储在最⼩的地址,即低位组放在最前⾯)。> 意味着⼤端法(最重要的字节存储在最⼩的地址,即⾼位组放在最前⾯)。
数组数据类型转换
代码案例
import numpy as np# 数组数据类型转换# 整型转换为浮点型print("转换结果:", np.float64(42))# 浮点型转换为整型print("转换结果:", np.int8(42.0))# 整型转换为布尔型print("转换结果:", np.bool(42))# 整型转换为布尔型print("转化结果:", np.bool(0))# 布尔型转换为浮点型print("转化结果:", np.float(True))# 布尔型转化为浮点型print("转化结果:", np.float(False))# 创建⼀个存储餐饮企业库存信息的数据类型。其中,⽤⼀个长度为40个字符的字符串来记录商品的名称,⽤⼀个64位的整数来记录商品的库存数量,最后⽤⼀个64位的单精度浮点数来记录商品的价格,具体步骤如下。# 创建数据类型df = np.dtype([("name", np.str_, 40), ("numitems",
np.int64), ("price", np.float64)])print("数据类型为:", df)# 查看数据类型,可以直接查看或者使⽤numpy.dtype 函数查看print("数据类型为:", df["name"])print("数据类型为:", np.dtype(df["name"]))# 在使⽤array函数创建数组时,数组的数据类型默认是浮点型。⾃定义数组数据,则可以预先指定数据类型itemz = np.array([("tomatoes", 42, 4.14), ("cabbages", 13, 1.72)], dtype=df)print("⾃定义数据为:", itemz)
⽣成随机数
random模块常⽤随机数⽣成函数
函数
seed
permutation
shuffle
binomial
normal
beta
chisquare
gamma
uniform
代码案例
import numpy as np# ⽣成随机数# 五约束条件下⽣成随机数print("⽣成的随机数组为:\n", np.random.
random(100))# ⽣成服从均匀分布的随机数print("⽣成的随机数组为:\n", np.random.rand(10, 5))# ⽣成服从正态分布的随机数print("⽣成的随机数组为: \n", np.random.randn(10, 5))# ⽣成给定上下范围的随机数,如创建⼀个最⼩值不低于 2、最⼤值不⾼于 10 的 2 ⾏ 5 列数组print("⽣成的随机数组为:\n", np.random.randint(2, 10, size=[2, 5]))
代码实现
访问数组
import numpy as np# 通过索引访问数组# ⼀维数组的原理arr = np.arange(10)# ⽤整数作为下标可以获取数组中的每个元素 列式存储print("索引结果为:", arr[5])# ⽤范围作为下标获取数组的⼀个切⽚,包括arr[3]不包括arr[5]print("索引结果为:", arr[3:5])# 省略开始下标,表⽰从arr[0]开始print("索引结果为:", arr[:5])# 下标可以使⽤负数,-1表⽰从数组后往前数的第⼀个元素print("索引结果为:", arr[-1])# 下标还可以⽤来修改元素的值arr[2:4] = 100, 101 # 索引结果为:: [ 0 1 100 101 4 5 6 7 8 9]# 下标还可以⽤来修改元素的值print("索引结果为:", arr)# 范围中的第三个参数表⽰步长,2表⽰隔⼀个元素取⼀个元素print("索引结果为: ", arr[1:-1:2])# 步长为负数时,开始下标必须⼤于结束下标print("索引结果为:", arr[5:1:-2])# 多维数组的索引arr = np.array([[1, 2, 3, 4, 5], [4, 5, 6, 7, 8], [7, 8, 9, 10, 11]])print("创建的⼆维数组为:\n", arr)# 索引第0⾏中第3和4列的元素print("索引结果为:\n", arr[0,
3:5])# 索引第2和3⾏中第3~5列的元素print("索引结果为:\n", arr[1:, 2:])# 索引第2列的元素print("索引结果为: \n", arr[:, 2])# 多维数组的索引(使⽤整数和布尔值索引访问数据)# 从两个序列的对应位置取出两个整数来组成下标:arr[0,1], arr[1,2], arr[2,3]print("索引结果为:", arr[[(0, 1, 2), (1, 2, 3)]])# 索引第2、3⾏中第0、2、3列的元素print("索引结果为:", arr[1:, (0, 2, 3)])# mask是⼀个布尔数组,它索引第1、3⾏中第2列的元素mask = np.array([1, 0, 1], dtype=np.bool)print("索引结果为:", arr[mask, 2])
改变数组形状
import numpy as np# 改变数组形态# 创建⼀维数组arr = np.arange(12)print("创建的⼀维数组为:", arr)# 设置数组的形状print("新的⼀维数组为:\n", shape(3, 4))# 查看数组维度print("数组维度为:", shape(3, 4).ndim)# 使⽤ravel函数展平数组arr = np.arange(12).reshape(3, 4)print('创建的⼆维数组为:\n', arr)print("数组展平后为: \n", arr.ravel())# 使⽤flatten函数展平数组# 横向展平print("数组展平为:", arr.flatten())# 纵向展平print("数组展平为:", arr.flatten('F'))# 组合数组arr1 =
np.arange(12).reshape(3, 4)arr2 = arr1 * 3print("创建的数组1为:\n", arr1)print("创建的数组2为:\n", arr2)# 使⽤hstack函数实现数组横向组合:np.hstack((arr1,arr2))print("横向组合为:\n", np.hstack((arr1, arr2)))# 使⽤vstack函数实现数组纵向组合:
np.vstack((arr1,arr2))print("纵向组合:\n", np.vstack((arr1, arr2)))# 使⽤concatenate函数实现数组横
向组合:
axis=1)print("split 函数实现数组横向分割\n", np.split(arr, 2, axis=1))# 使⽤split函数实现数组纵向分割: np.split(arr, 2,
axis=0)print("split 函数实现数组纵向分割\n", np.split(arr, 2, axis=0))
NumPy 矩阵与通⽤函数
创建与组合矩阵
·使⽤mat函数创建矩阵:
matr1 = np.mat("1 2 3;4 5 6;7 8 9")
·使⽤matrix函数创建矩阵:
matr2 = np.matrix([[123],[456],[789]])
·使⽤bmat函数合成矩阵:
np.bmat("arr1 arr2; arr1 arr2")
矩阵的运算
·矩阵与数相乘:matr1*3
·矩阵相加减:matr1±matr2
·矩阵相乘:matr1*matr2
·矩阵对应元素相乘:np.multiply(matr1,matr2)
·矩阵特有属性:
属性
T
H
I
A
ufunc函数
全称通⽤函数(universal function),是⼀种能够对数组中所有元素进⾏操作的函数。
·四则运算:加(+)、减(-)、乘(*)、除(/)、幂(**)。数组间的四则运算表⽰对每个数组中的元素分别进⾏四则运算,所以形状必须相同。·⽐较运算:>、=、<=、!=。⽐较运算返回的结果是⼀个布尔数组,每个元素为每个数组对应元素的⽐较结果。< span="">
·逻辑运算:np.any函数表⽰逻辑“or”,np.all函数表⽰逻辑“and”。运算结果返回布尔值。
ufunc函数的⼴播机制
⼴播(broadcasting)是指不同形状的数组之间执⾏算术运算的⽅式。需要遵循4个原则。
·让所有输⼊数组都向其中shape最长的数组看齐,shape中不⾜的部分都通过在前⾯加1补齐。
·输出数组的shape是输⼊数组shape的各个轴上的最⼤值。
·如果输⼊数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够⽤来计算,否则出错。
·当输⼊数组的某个轴的长度为1时,沿着此轴运算时都⽤此轴上的第⼀组值。
⼀维数组的⼴播机制
⼆维数组的⼴播机制
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论