Python数据分析之Numpy
本文最后更新于27 天前,其中的信息可能已经过时,如有错误请发送邮件到9122129@gmail.com

Numpy介绍

Numpy是什么?NumPy (Numerical Python)是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。实践中,NumPy已成为Python 中默认的矩阵运算库。几乎所有涉及到矩阵相关操作的其他的库(如Pandasxarray等等),都是基于NumPy实现的。对于Python,我们常常会有运行速度慢之类的刻板印象。然而对于Python 中的矩阵运算库NumPy,这一刻板印象是不成立的。如果我们只使用NumPy进行计算,而不使用Python中原生的for循环等操作,那么实际上,我们的运算速度往往是不输给,甚至是胜过Fortran的。

这是因为NumPy是基于CForan实现的。在此之上,它还会使用blas,进一步增快运行速度。同时,它还会进行一些细节上的优化。这使得一般情况下,NumPy的矩阵运算速度应当是优于未经优化的 Fortran代码的。

作为Python数值计算宇宙的重要基础设施,我们有必要对NumPy进行深入的掌握,从而发挥Python的真正潜力。

Ndarray对象

NumPy最重要的一个特点是其N维数组对象ndarray,它是一系列同类型数据的集合,以О下标为开始进行集合中元素的索引。

ndarray对象是用于存放同类型元素的多维数组。

ndarray 中的每个元素在内存中都有相同存储大小的区域。

ndarray内部由以下内容组成:

一个指向数据(内存或内存映射文件中的一块数据)的指针。

数据类型或dtype,描述在数组中的固定大小值的格子。

一个表示数细形状(shape)的元组,表示各维度大小的元组。

一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要”跨过””的字节数。

实例:我们可以先从一个hello world等级的实例,来入门NumPy:

import numpy as np

a = np.array([1,2,3])

b= np.array([[1, 2], [3, 4]])

c= np.array([1,2,3], dtype = np.float64)

print(a)

print(b)

print(c)

输出结果:

[1,2,3]

[[1,2]

[3,4]]

[1.,2.,3.]

在上面的例子里,我们分别进行了以下3个操作:

1.创建了一个一维数组

2.创建了一个2维数组

3.创建了一个1维数组,并指定了其中元素的类型为双精度浮点数

使用NumPy创建一个数组就是这么简单,指定数据的具体值,然后指定数据类型dtype(可选),就可以了。

NumPy 数据类型

NumPy支持的数据类型比Python 内置的类型要多很多,基本上可以和C语言的数据类型对应上,其中部分类型对应为Python内置的类型。

d = np.array([1,2,3],dtype=float) # dtype为python内置类型float

e = np.array([1,2,3],dtype=np.float64)#其与双精度浮点数flaot64是一样的

f = np.array([1,2,3],dtype=np.float32)#可以将dtype设置为各种不同的数据类型

NumPy数组属性

ndim数组维度shape数组每个维度大小 size数组的总大小 dtype数据类型itemsize 每个数组元素字节大小nbytes 数组总字节大小 fags ndaray对象的内存信息real ndarray元素的实部(复数的实部) imag ndarray元素的虚部(复数的虚部)

a =np.array([1,2,3],dtype=float)

print(“a ndim:”,a.ndim)

print(“a shape”,a.shape)

print(“a size” ,a.size)

print(“a dtype”,a.dtype)

print(” a itemsize:”,a.itemsize,” bytes”)

print(“a nbytes:”,a.nbytes,” bytes”)

print(“a flags:”,a.flags)

输出结果如下:

a ndim: 1a shape (3,)a size 3

a dtype float64a itemsize: 8 bytesa nbytes: 24 bytes

a flags: C_CONTIGUouS : TrueFCONTIGUoUS : True

oWNDATA : True

WRITEABLE : TrueALIGNED : True

WRITEBACKIFCOPY : FalseUPDATEIFCOPY : False

数据类型转换

我们有时候需要将一种数据类型的数组转化为另一种。这个时候我们就需要用到astype方法进行转化:

a = np.array([1,2,3],dtype=float)

b = a.astype(int)

print (b)

print (b.dtype)

输出结果:

[1,2,3]

dtype(‘int32’)

便捷创建一个Numpy数组

ndarray数组除了可以使用ndarray来创建外,也可以通过以下几种方式来创建。

np.zeros

创建指定大小的数组,数组元素以0来填充:

a = np.zeros((2,3), dtype = np.float64)

print(a)

输出结果:

[[0,0,0]

[0,0,0]]

np.ones

创建指定形状的数组,数组元素以1来填充:

a = np.ones([2,3], dtype = int)#输入的数组形状不仅可以是元组,也可以是一个列表

print(a)

输出结果:

[[1,1,1]

[1,1,1]]

np.eye

创建指定形状的单位矩阵。

np.eye(4)

[[1.,0.,0.,0.],

[0.,1.,0.,0.],

[0.,0.,1.,0.],

[0.,0.,0.,1.]]

np.random创建随机数组

除了创建元素全为0和1的数组之外,NumPy也支持创建元素为随机值的数组。

np.random.rand

创建指定维度大小的,样本位于[0,1)的随机样本。

np.random.rand(2,3)

np.random.randint

创建指定维度大小的,样本为随机整数样本的数组。

np.random.randint(low=1,high=10, size=(5,6))

np.random.randn

创建指定维度大小的,样本为正态分布随机值的数组

np.random.randn(2,4)

从数值范围创建数组

NumPy 也可以从某个范围中,创建所需的数组。

np.arange

根据start 与stop指定的范围以及step 设定的步长,生成一个ndarray。注意,停止的stop值不在生成的数组的范围之内。

x=np.arange(start=10,stop=20,step=2)

array([10,12,14,16,18])

np.linspace

np.linspace函数用于创建一个一维数组,数组是一个等差数列构成的。

#生成开始值为10,结束值为20,大小为51的等差数组

np.linspace(start=10, stop=20, num=51)

array([10.,10.2,10.4,10.6,10.8,11.,11.2,11.4,11.6,11.8,12.,12.2,12.4,12.6,12.8,13.,13.2,13.4,13.6,13.8,14.,14.2,14.4,14.6,14.8,15.,15.2,15.4,15.6,15.8,16.,16.2,16.4,16.6,16.8,17.,17.2,17.4,17.6,17.8,18.,18.2,18.4,18.6,18.8,19.,19.2,19.4,19.6,19.8,20. ])

np.logspace

np.logspace函数用于创建一个对数等比数列

#生成开始值为2**1,结束值为2**8,大小为8的等差数组

np.logspace(start=1, stop=8 ,num=8 ,base=2)

array([ 2.,4.,8.,16.,32.,64.,128.,256.])

NumPy 统计函数

NumPy数组中提供了一些简单的统计函数,可以帮助我们计算数组的最大、最小值、平均值、中位数等

最大最小值

可以使用.max().min()或np.amax()/np.amin(),计算数组的最大最小值

a = np.random.randint(low=0,high=99, size=(7,9))

print (a, “\n”,a.max(),”\n”,a.min())

输出结果:

[[92 7 79 65 12 18 10 63 34]

[63 39 67 69 49 43 9 35 86]

[17 33 72 22 57 31 6 33 53]

[89 63 3 33 33 35 13 53 23]

[31 25 76 48 86 42 15 44 64]

[8 67 34 77 44 66 10 12 14]

[63 37 48 14 94 50 21 31 28]]

94

3

平均值

可以使用np.mean()/np.average()或.mean()方法获取数组中所有元素的均值

a.mean()

中位数

使用np.median()计算数组的中位数

np.median(a)

标准差

使用np.std计算标准差

np.std(a)

Nump数据-索引&切片&排序

ndarray对象的内容可以通过索引或切片来访问和修改通过sort函数进行排序

索引

ndarray 数组可以基于0-n的下标进行索引

import numpy as np

a = np.arange(10)

print(a)

print(a[3])

[0 1 2 3456789]

3

切片

切片对象通过内置的slice 函数,并设置start, stop 及step参数进行,从原数组中切割出一个新数组。

import numpy as np

a = np.arange(10)

s = slice(2,7,2)#从索引2开始到索引7停止,间隔为2print (a[s])

以上实例中,我们首先通过arange()函数创建ndarray对象。然后,分别设置起始,终止和步长的参数为2,7和2。我们也可以通过冒号分隔切片参数start:stop:step来进行切片操作。例:

b = a[2:7:2]#从索引2开始到索引7停止,间隔为2

print(b)

[246]

冒号:的解释:如果只放置一个参数,如[2],将返回与该索引相对应的单个元素。如果为[2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,如[2:7],那么则提取两个索引(不包括停止索引引)之间的项。例:

a = np.arange(10)#[0 1 2 3 4 5 6 7 8 9]

b= a[5]

print(b)

print(a[2:])

print(a[2:5])

多维数组同样适用上述索引提取方法:

import numpy as np

a = np.array([[1,2,3].[3,4,5],[4.5,6]])

print(a)

#从某个索引处开始切割

print(‘从数组索引a[1:]处开始切割”)

print(a[1:])

从数组索引 a[1:]处开始切割

[[3 4 5]

[4 5 6]]

切片还可以包括省略号…,来使选择元组的长度与数组的维度相同。如果在行位置使用省略号,它将返回包含行中元素的ndarray。例:

print (a[…,1)#第2列元素

print (a[1,…])#第2行元素

print (a[…,1:])#第2列及剩下的所有元素

排序

通过np.sort()可以对数组对象进行排序

import numpy as np

s = np.random.rand(1,3)

print(s)

print(np.sort(s,axis = 1)) #axis = 1表示按行对元素排序,0表示按列对元素排序

数组的相关运算

数组的运算可以分为:

数组内的运算

数据与数组之间的运算

数组内的运算

Numpy提供了丰富的函数进行数组内的运算。

求和求乘积求最值求均值求方差和标准差幂运算对数运算数组内的运算

import numpy as np

a = np.random.randint(low=1,high=100,size=(10))#创建一个随机从1~100取数,10个元素的数组

print(a)

print(np.sum(a))#求和

print(np.prod(a))#求乘积

print(np.max(a))#最大值

print(np.min(a))#最小值

print(np.mean(a))#均值

print(np.var(a))#方差

print(np.std(a))#标准差

print(np.sqrt(a))#开方(每个元素)

print(np.square(a))#平方(每个元素)

print(np.exp(a))#以e为底的指数次方

print(np.log(a))#自然对数

print(np.log2(a))#底数为2对数

print(np.log10(a))#底数为10对数

数组间的运算

数组间的运算依然是包括了加(+)、减(-)、乘(x)除(/)等,这些运算可以适合于具有相同的行数和列数的多个数组,并且是对数组的全部元素进行运算。

import numpy as np

a = np.random.randint(low=1,high=100,size=(10))#创建一个随机从1~100取数,10个元素的数组

b = np.random.randint(low=1,high=100,size=(10))

print(a)

print(b)

[27 64 2 49 60 43 90 45 27 72]

[76 95 24 21 78 12 28 51 70 71]

c = a+b

d = a-b

e = a*b

f = a/b

print(c)

print(d)

print(e)

print(f)

评论

  1. 听雨
    Windows Chrome
    4 周前
    2024-3-27 20:09:09

    学废了学废了

    • 骑着蛤蟆扛着枪
      听雨
      Android Chrome
      4 周前
      2024-3-27 21:06:57

      我也学习了,不过学废了

      • 忆韶华
        骑着蛤蟆扛着枪
        Windows Edge
        4 周前
        2024-3-27 21:16:00

        我也不会

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇