Python数据分析之初识numpy常见方法使用案例

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据分析之初识numpy常见方法使用案例相关的知识,希望对你有一定的参考价值。

声明与简介

numpy是python数据科学计算的基础包,这个包有多维数据对象ndarray,以及诸多它的派生对象(如:掩码数组、矩阵),同时这些对象还提供了数学,逻辑,形状处理,排序,选择,离散傅立叶变换,基本线性代数,基本统计运算,随机模拟等常见的科学计算方法。

创建ndarray

直接创建ndarray

#通过np.array直接创建ndarray数组。
import numpy as np
arr1=np.array([4,6,9])
print(type(arr1[2],arr1)
#不难看出这里元素的类型是int
<class 'numpy.int32'> [4 6 9]

类型转换

#1 ndarry里定义的数据类型一般都是统一的,如果不统一,在类型可以转换的情况下,可自动进行转换。比如int转float
import numpy as np
arr1=np.array([4.32,6,9])
print(type(arr1[2],arr1)
#不难看出这里元素的类型转换成了float
<class 'numpy.float64'> [4.32 6.   9.  ]

# 2 float转str
import numpy as np
arr1=np.array([4.32,'we',9])
print(type(arr1[2],arr1)
#结果
<class 'numpy.str_'>

通过模板创建

元素都是0

#可以通过np.zeros和np.ones初始化ndarray,指定大小和类型。
#创建一个有3个元素都为0的一维ndarray。
arr1=np.zeros(3,dtype=float)

元素都是1

#创建一个3行4列、元素全是1的数组。
arr1=np.ones((3,4),dtype=int

特定元素

# 创建一个2行3列、元素全是5.12的数组。
arr1=np.full((2,3),5.12)

等差数组步长法

可以通过numpy的arange方法进行初始化生成等差ndarray,指定起始值、结尾值、步长(增幅)。
比如生成个以1为起始,每次递增3并以20为最终值的等差数组。注意:这里达不到20。
print(np.arange(1,20,3))
#结果为:
[ 1  4  7 10 13 16 19]

#当然,这里增幅可以是负的,即
print(np.arange(20,1,-3))
#结果为
[20 17 14 11  8  5]

等分数组平均法

#可以通过起始值和份数来等差划分数组,比如生成3个等差元素从3到15。
print(np.linspace(3,15,3))
#结果,计算方法 (15-3)/3,所以步长为6。
[ 3.  9. 15.]

均匀分布随机数

#通过np.random模块可以生成随机数,这里是调用其random方法生成均匀的随机数。
均匀分布即指定区间内的点都有相同的概率被取到。
比如:生成2×2的数组,其元素为0到1之间均匀随机数。
print(np.random.random((2,2))) #结果
[[0.15185125 0.52790783]  [0.16011147 0.29797948]]

正态分布随机数

#通过np.random模块可以生成随机数,这里是调用其normal方法生成正太分布的随机数。
其中标准正态分布是均值的0、标准差是1。
print(np.random.normal(0,1,(2,2))) #结果
[[-0.25384836 -2.06285573]  [-2.27651345  0.90667998]]

随机整数

# 1通过np.random模块可以生成随机数,这里是调用其randint方法生成指定类型的随机数。
#生成2到20之间的6个随机数
print(np.random.randint(2,20,6))
#结果,当然也可以指定其它shape的数组。
[ 9  3 12 11 10 12]

生成主对角线数组

通过np.eye可以生成对角线数组(矩阵)。
print(np.eye(4))
#结果
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]

数据类型

数据类型详解

注:查看某个类型的范围(含最小、大值),可以通过numpy内置的方法,比如查看float16的最大值,可以:
print(np.finfo(np.float16))
#结果
Machine parameters for float16
---------------------------------------------------------------
precision =   3   resolution = 1.00040e-03
machep =    -10   eps =        9.76562e-04
negep =     -11   epsneg =     4.88281e-04
minexp =    -14   tiny =       6.10352e-05
maxexp =     16   max =        6.55040e+04
nexp =        5   min =        -max

不过针对float16,我们最大只能定义到65519.0,但输出值为65500.0,而定义为65520.0时则显示为inf(即无限大整数的意思)。

ndarray的基础方法

维度ndim

维度类似我们在空间里看东西的视角,常见的有1维直线、2维平面、3维立体、更高维等。np里应用ndim方法来查看维度。

print(np.random.randint(1,20,(2,4,5)).ndim)
#结果为,即该数组为3维。
3
#按照长乘宽乘高更好理解些。

形状shape

形状shape是每个形状的大小,返回的是一个元组,这里显然是(2,4,5),一般我们说成是2×4×5的数组。

print(np.random.randint(1,20,(2,4,5)).shape)
#结果
(2, 4, 5)

大小size

大小统计的是整个数组里的元素个数,这里我们不难知道上述数组总共有2*4*5=40个元素。

print(np.random.randint(1,20,(2,4,5)).size)
#结果
40

数据类型dtype

数据类型是当前数组里元素的类型,如int、float。

print(np.random.randint(1,20,(2,4,5)).dtype)
#结果
int32

访问数组元素

# 1 可以通过数组索引(中括号下标的方式)访问元素。比如访问第1维、第2维、第3维交叉的元素,则可以通过如下方式访问。注意数组索引从0开始。
arr4=np.random.randint(1,20,(2,4,5)) print(arr4,arr4[0][1][2])
#或者
print(arr4,arr4[0,1,2])
#结果,有随机性。
15

# 2 通过想反向取,可以使用索引值:-1、-2…。比如要取元素8,则反向对应的索引值为-2。
print(np.array([2,8,9])[-2])
#结果
8

普通数组切片

可以访问数组时指定索引范围来访问,即切片形式。
#1 比如访问某1维数组的前4个元素,注意因为python遵循左闭右开,所以最右边的值取不到。即取的索引为0、1、2、3,不包含4。
print(np.array([2,8,9,10,23,27])[:4])
#结果
[ 2  8  9 10]

#2 比如访问某1维数组的第2到第4个元素。原理同上。
print(np.array([2,8,9,10,23,27])[2:4])
#结果
[ 9 10]

#3 索引从某个位置到最后
print(np.array([2,8,9,10,23,27])[4:])
#结果
[23 27]


#4 从后往前取,比如-3到-1,这里也是左闭右开,即-1取不到。
print(np.array([2,8,9,10,23,27])[-3:-1])
#结果
[10 23]

跳跃式数组切片

#1 索引隔位取,比如从0开始每隔2个索引号取一个元素
print(np.array([2,8,9,10,23,27])[::2])
#结果
[ 2  9 23]

#2 索引隔位指定起始索引位置取,比如索引从3开始每隔2个索引号取一个元素。
print(np.array([2,8,9,10,23,27])[3::2])
#结果
[ 2  9 23]

#3 元素逆转,即输出数组和原数组元素是逆向的。
print(np.array([2,8,9,10,23,27])[::-1])
#结果
[27 23 10  9  8  2]

#4 指定索引值逆转元素,即输出数组是原数组元素从指定索引位置逆序。元素个数是指定的值+1。比如这里输出数组应该是4+1=5个元素。
print(np.array([2,8,9,10,23,27])[4::-1])
#结果
[23 10  9  8  2]

注:高维数据的数据切片类似。

形状转换

这里是通过调用reshape方法将数组进行形状的转换。比如将一个1维数组转换为2为的,2×3的数组。
print(np.array([2,8,9,10,23,27]).reshape(2,3))
#结果
[[ 2  8  9]  [10 23 27]]

合并

# 1 同维度数组合并,np的concatenate可以合并,合并之后不改变原来的维度。
x=np.array([1,2,3,4]) y=np.array([6,7,8]) print(np.concatenate([x,y]))
#结果
[1 2 3 4 6 7 8]
注:可以合并多个数组,不一定是2个。

#2 不同维度的合并(一般差一个维度)合并时需要指定方向,比如是按列(用np.vstack)、行(np.hstack)

这里vstack的v对应单词vertical即垂直(保持列方向一致)
hstack的h对应单词horizontal即水平(保持行方向一致)
#2.1 vstack 垂直方向合并
x=np.array([1,2,3])  y=np.array([[6,7,8],[9,5,10]]) print(np.vstack([x,y]))

#结果,这里可见列数是对应相等的,即都是3个。
[[ 1  2  3]  [ 6  7  8]  [ 9  5 10]]

#2.2 hstack 水平方向合并
x=np.array([[1,2,3],[4,5,6]]) y=np.array([[6,7,8],[9,5,10]]) print(np.hstack([x,y]))

#2.2 dstack合并生成新的维
x=np.array([[1,2,3],[3,2,1]]) y=np.array([[6,7,8],[9,5,10]]) print(np.dstack([x,y]))
#结果
[[[ 1  6]
  [ 2  7]
  [ 3  8]]

 [[ 3  9]
  [ 2  5]
  [ 1 10]]]

拆分

拆分和合并是相反的操作。
# 1 指定拆分的中间区段,剩下的取区段的头和尾。
x=np.array([1,2,3,4,5,6]) x1,x2,x3=np.split(x,[2,5]) print (x1,x2,x3)

#2 vsplit垂直切分,保持列数不变。这里的拆分的数N比子数组少1,即子数组为N+1。
x=np.array([[1,2,3,4],[5,6,7,8]])
x1,x2=np.vsplit(x,[1])
print (x1,x2)
#结果
[[1 2 3 4]] [[5 6 7 8]]

#3 hsplit垂直切分,保持列数不变。这里的拆分参数N指的是索引位置。会分为2部分。
x=np.array([[1,2,3,4],[5,6,7,8]]) x1,x2,x3=np.hsplit(x,[3]) print (x1,x2,x3)
#结果
[[1 2 3] [5 6 7]] 
[[4] [8]]

#4 hsplit垂直切分,保持列数不变。这里的拆分参数可以是个区段,则会分3部分。
x=np.array([[1,2,3,4],[5,6,7,8]]) x1,x2,x3=np.hsplit(x,[2,3]) print (x1,x2,x3)
#结果
[[1 2][5 6]] 
[[3] [7]] 
[[4] [8]]

以上是关于Python数据分析之初识numpy常见方法使用案例的主要内容,如果未能解决你的问题,请参考以下文章

Python数据分析pandas之series初识

100天精通Python(数据分析篇)——第49天:初识numpy模块

python3初识 之 集合

numpy初识

从方法numpy.array()的参数意义来认识Python中常见的数据存储布局(Memory Layout)中参数KACF的意义

Python学习之路:NumPy初识