数据分析————numpy基础

Posted ~小疯子~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据分析————numpy基础相关的知识,希望对你有一定的参考价值。

​准备了好长时间,想要写点关于数据分析的文章,但一直忙于工作,忙里抽闲更新一篇关于numpy的文章。

本文主要介绍numy的应用,常用的一些函数的使用,对数组,矩阵的操作:

一、 什么是numpy?

NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。NumPy提供了大量的库函数和操作,它帮助程序员轻松地进行数值计算。这类数值计算广泛用于以下任务:

  • 机器学习模型:在编写机器学习算法时,需要对矩阵进行各种数值计算。例如矩阵乘法、换位、加法等。NumPy提供了一个非常好的库,用于简单(在编写代码方面)和快速(在速度方面)计算。NumPy数组用于存储训练数据和机器学习模型的参数。

  • 图像处理和计算机图形学:计算机中的图像表示为多维数字数组。NumPy成为同样情况下最自然的选择。实际上,NumPy提供了一些优秀的库函数来快速处理图像。

  • 数学任务:NumPy对于执行各种数学任务非常有用,如数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于Python的MATLAB的快速替代。

二、 numpy中的函数

1、np.array () 

array:  python所自带的array模块只支持一维数组的创建,不支持多维数组。

np.array:  numpy中的np.array弥补了array的不足。其dtype参数指定数组中元素的类型。

import numpy as np
# 常规数组创建方法
a1 = np.array([1, 2, 4])
a2 = np.array([[1.0,2.0],[3.0,4.0]])
a3 = np.array([[1,2],[3,4]],dtype=complex) # 指定数据类型,complex复数类型
print(a1,"\\n.a2.\\n",a2,"\\n.a3.\\n", a3)
"""
运行结果:
[1 2 4] 
.a2.
 [[1. 2.]
 [3. 4.]] 
.a3.
 [[1.+0.j 2.+0.j]
 [3.+0.j 4.+0.j]]
"
""

2、np.arange ()

arange函数: 用于创建等差数列数组

np.arange([start, ]stop, [step, ]dtype=None)

  • start:  可忽略不写,默认从0开始;起始值

  • stop:  结束值;生成的元素不包括结束值

  • step:  可忽略不写,默认步长为1;步长

  • dtype:  默认为None,设置显示元素的数据类型

nd1 = np.arange(5) #array([0, 1, 2, 3, 4]) 随机生成5个自然数
nd2 = np.arange(1,5) #array([1, 2, 3, 4])
# nd3:1为起点,间隔为2,5为终止点但取不到,(左开右闭取值) 
nd3 = np.arange(1,5,2) 
print(nd1)
print(nd2)
print(nd3)
# 利用字符编码创建数组
# 创建一个单精度浮点数组
m3 = np.arange(7, dtype='f')
print(m3)
# 创建复数数组
m4 = np.arange(7, dtype='D')
print(m4)
"""
运行结果:
nd1: [0 1 2 3 4]
nd2: [1 2 3 4]
nd3: [1 3]
m3: [0. 1. 2. 3. 4. 5. 6.]
m4: [0.+0.j 1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j 6.+0.j]
"""

3、np.reshape()

np.reshape(): 给数组一个新的形状,并且数组中的元素值不变

np.reshape(a, newshape, order='C)参数说明:

  • a:被转换的数组

  • newshape:整数值或整数元组。新的形状应该兼容于原始形状。如果是一个整数值,表示一个一维数组的长度;如果是元组,一个元素值可以为-1,此时该元素值表示为指定,此时会从数组的长度和剩余的维度中推断出

  • order: 可选(忽略)

  • a = np.arange(15)
    b = a.reshape(3, 5)
    print(a)
    print("转换后的数组:",b)  #将一维数组转换成为3行5列
    """
    运行结果:
    [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
    转换后的数组:
    [[ 0  1  2  3  4]
     [ 5  6  7  8  9]
     [10 11 12 13 14]]
    """

    4、np.ndim()

np.ndim():  ndim返回的是数组的维度,返回的只有一个数

# ndim返回的是数组的维度,返回的只有一个数,该数即表示数组的维度
print("a的维度:",a.ndim)
print("b的维度:",b.ndim)
"""
运行结果:
a的维度:1
b的维度:2
"""

5、np.shape()

np.shape():  表示各位维度大小的元组。返回的是一个元组

a = np.arange(15)
b = a.reshape(3, 5)
c = np.array([[[1, 4,6],[2, 5,7]],[[5,2,1],[4, 5,7]]])
print("a,b,c的维度:",a.ndim,b.ndim,c.ndim)
print("数组a:",a)
print("数组b:",b)
print("数组c:",c)
# shape:表示各位维度大小的元组。返回的是一个元组
print("a的维度的大小:",a.shape) # 查看各维度大小的元组
print("b的维度的大小:",b.shape)
print("c的维度的大小:",c.shape)
"""
运行结果:
a,b,c的维度:1 2 3
数组a: [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
数组b:[[ 0  1  2  3  4]
         [ 5  6  7  8  9]
         [10 11 12 13 14]]
数组c: [[[1 4 6]
      [2 5 7]]
     [[5 2 1]
    [4 5 7]]]
a的维度的大小: (15,)
b的维度的大小: (3, 5)
c的维度的大小: (2, 2, 3)
"""

对于一维数组:有疑问的是为什么不是(1,15),因为a.ndim维度为1,元组内只返回一个数。

对于二维数组:前面的是行,后面的是列,他的ndim为2,所以返回两个数。

对于三维数组:很难看出,对于上面打印的c, 看下它是什么结构。

数组c:
[[[1 4 6]
      [2 5 7]]
     [[5 2 1]
    [4 5 7]]]

先看最外面的中括号,包含 [[1,4,6],[2,5,7]] 和 [[5,2,1],[4,5,7]],假设他们分别为数组A、B,就得到[A,B],如果A、B仅仅是一个数字,他的ndim就是2,这就是第一个数。但是A、B是(2,3)的数组。所以结合起来,这就是c的shape,为(2,2,3)。

将这种方法类比,也就可以推出4维、5维数组的shape。

6、np.dtype()

np.dtype():  一个用于说明数组数据类型的对象。返回的是该数组的数据类型。

print("数据类型:",a.dtype) # 查看数据类型
"""
运行结果:
数据类型: int64
"""

由于图中的数据都为整形,所以返回的都是int64。如果数组中有数据带有小数点,那么就会返回float64。

有人可能会问:整形数据不应该是int吗?浮点型数据不应该是float吗?

解答:int32、float64是Numpy库自己的一套数据类型。

7、np.astype()

np.astype():  转换数组的数据类型

vec_1 = np.array(['1','2','3'])
vec_2 = vec_1.astype('float')
print("转换前的类型:",vec_1.dtype)
print(vec_1)
print("转换后的类型:",vec_2.dtype)
print(vec_2)
"""
运行结果:
转换前的类型:<U1
['1' '2' '3']
转换后的类型:float64
[1. 2. 3.]
"""

注意:其中的float,它是python内置的类型,但是Numpy可以使用。Numpy会将Python类型映射到等价的dtype上。

还有其他的类型转换(大家自行测试):

int32 --> float64        完全ok

float64 --> int32        会将小数部分截断

string  --> float64        如果字符串数组表示的全是数字,也可以用astype转化为数值类型

8、np.min(), np.max()

np.min(): 获取数组中最小的元素

np.max(): 获取数组中最小的元素

print("获取数组中最小的值:",b.min())
print("获取数组中最大的值:",b.max())
"""
运行结果:
获取数组中最小的值: 0
获取数组中最大的值: 14
"""

9、np.zeros(), np.ones()

np.zeros():  设置一个元素全为0的数组, 返回给定形状和类型的用0填充的数组

np.ones():  设置一个元素全为1的数组, 返回给定形状和类型的用2填充的数组组 

zeros(shape, dtype=float, order='C'):

ones(shape, dtype=float, order='C'):

  • shape设置数组形状

  • dtype数据类型, 可选参数,默认为np.float64

  • order可选参数(可忽略)

np.zeros((3,4)) # 设置一个3行4列的0矩阵
np.ones((2,3,4), dtype=np.int32) # 设置一个3行4列的3维的值均为1的矩阵
"""
运行结果:
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])
array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],
​
       [[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]]], dtype=int32)
"""

10、np.random()

np.random():  随机抽样, 生成随机数据

np.random.rand(d0,d1,....,dn):返回随机样本位于[0,1)之间

np.random.rand() # 返回0~1中的一个随机值
np.random.rand(3, 2)# 返回3行4列的元素值在0~1随机矩阵
"""
运行结果:
np.random.rand() :0.6759565926081442
np.random.rand(3, 2):
array([[0.50718076, 0.55366315, 0.8955532 ],
       [0.78137634, 0.67035372, 0.56846724]])
"""

randn(d0, d1,...dn): 返回一个样本或多个样本值, 为标准的正态分布

np.random.randn()
np.random.randn(2,3)
"""
运行结果:
np.random.randn():-1.723572225201004
np.random.randn(2,3):
array([[ 0.5517019 ,  0.94568245, -0.73698193],
       [ 0.18349642, -1.63614097,  0.74157234]])
"""

randint(low[, high,size]) : 返回low<=n<high范围的随机整数矩阵,位于半开区间[low, high)

  • size:随机整数矩阵大小

np.random.randint(4, size=8)
np.random.randint(4, size=(2,3))
"""
运行结果:
array([1, 3, 0, 0, 2, 0, 0, 3])
array([[2, 3, 2],
       [0, 0, 0]])
"""

np.random.random(size):

返回指定size的[0.0,1.0)随机数矩阵,random_sample、ranf、sample和它一样。

np.random.random()
np.random.random(size=[2,3])
np.random.random((2,3)) # 设置一个2行3列的值在0~1之间的矩阵
"""
运行结果:
0.7893031677602365
array([[0.78053854, 0.18131081, 0.82077647],
       [0.43697461, 0.91715564, 0.05549399]])
array([[0.38284667, 0.94033216, 0.10049719],
       [0.08550353, 0.83507381, 0.70694944]])
"""

11、np.linspace()

np.linspace() :  返回在指定范围内的均匀间隔的数字(组成的数组),也即返回一个等差数列

numpy.linspace(start,stop[,num=50[,endpoint=True[,retstep=False[,

dtype=None]]]]]):

  • start: 起始点

  • stop: 结束点

  • num:  元素个数,默认为50

  • endpoint: 是否包含stop数值,默认为True,包含stop值;若为False,则不包含stop值

  • retstep:  返回值形式,默认为False,返回等差数列组,若为True,则返回结果(array([`samples`, `step`])),

  • dtype: 返回结果的数据类型,默认无,若无,则参考输入数据类型。

# linspace创建等差数列的函数,10个值从0到90的等差数列
np.linspace(0 , 90, 10) 
np.linspace(0 , 90, 10, endpoint=False)
np.linspace(0 , 90, 10, retstep =True) # 返回步长
"""
运行结果:
array([ 0., 10., 20., 30., 40., 50., 60., 70., 80., 90.])
array([ 0.,  9., 18., 27., 36., 45., 54., 63., 72., 81.])
(array([ 0., 10., 20., 30., 40., 50., 60., 70., 80., 90.]), 10.0)
"""

12、np.ravel(), np.flatten()

两个函数都是将多维数组降为一维的,但是两者的区别是返回拷贝还是返回视图.

np.flatten()返回一份拷贝,对拷贝所做修改不会影响原始矩阵

np.ravel()返回的是视图,修改时会影响原始矩阵

# 改变数组维度
# print(b)
w1 = np.array([[1 , 2] , [3 , 4]])
w1_f = w1.flatten() # 将数组展平,flatten函数会请求分配内存来保存结果
w1_r = w1.ravel() # 将数组展平, 返回数组的一个视图
print("w1_f",w1_f)
print("w1_r",w1_r)
# 二者的区别
w1_f[0] = 10
print('w1:' , w1)
w1_r[0] = 10
print('w1:' , w1)
"""
运行结果:
w1_f [1 2 3 4]
w1_r [1 2 3 4]
w1: [[1 2]
     [3 4]]
w1: [[10  2]
     [ 3  4]]
"""

13. np.resize()

np.resize(): 修改数组的维度

b = np.arange(24).reshape(2,3,4) # 三维坐标
b.shape = (6, 4) # 6X4的多维数组
print(b)
b.resize((2,12))
print(b)
"""
运行结果:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]]
 
 [[ 0  1  2  3  4  5  6  7  8  9 10 11]
 [12 13 14 15 16 17 18 19 20 21 22 23]]
 
"""

14、np.transpose()

np.transpose(): 转置矩阵

# transpose转置矩阵
b = np.arange(24).reshape(2,3,4) # 三维坐标
b.shape = (6, 4) # 6X4的多维数组
b.transpose()
"""
运行结果:
array([[ 0,  4,  8, 12, 16, 20],
       [ 1,  5,  9, 13, 17, 21],
       [ 2,  6, 10, 14, 18, 22],
       [ 3,  7, 11, 15, 19, 23]])
"""

15、组合数组

水平组合:

np.hstack() ,np.concatenate(): :  在水平方向上平铺

# 组合数组
a = np.arange(9).reshape(3,3)
b = 2 * a
print("a:",a)
print("b:",b)
# 水平组合
hs = np.hstack((a, b))
con_hs = np.concatenate((a,b), axis=1)
print("hs:",hs)
print("con_hs:",con_hs)
"""
运行结果:
a: [[0 1 2][3 4 5] [6 7 8]]
b: [[ 0  2  4][ 6  8 10] [12 14 16]]
hs: [[ 0  1  2  0  2  4]
     [ 3  4  5  6  8 10]
     [ 6  7  8 12 14 16]]
con_hs: [[ 0  1  2  0  2  4]
     [ 3  4  5  6  8 10]
     [ 6  7  8 12 14 16]]
"""

垂直组合:

np.vstack(),np.concatenate() :在竖直方向上堆叠

# 垂直组合
vs = np.vstack((a,b))
con_vs = np.concatenate((a,b), axis=0)
print("vs:", vs)
print("con_vs:", con_vs)
"""
运行结果:
a: [[0 1 2][3 4 5] [6 7 8]]
b: [[ 0  2  4][ 6  8 10] [12 14 16]]
vs: [[ 0  1  2][ 3  4  5][ 6  7  8]
     [ 0  2  4][ 6  8 10][12 14 16]]
con_vs: [[ 0  1  2][ 3  4  5][ 6  7  8]
       [ 0  2  4][ 6  8 10] [12 14 16]]
"""

深度组合:

np.dstack(): 对应的元素组合

np.dstack((a, b))
"""
运行结果:
a: [[0 1 2][3 4 5] [6 7 8]]
b: [[ 0  2  4][ 6  8 10] [12 14 16]]
array([[[ 0,  0],
        [ 1,  2],
        [ 2,  4]],
​
       [[ 3,  6],
        [ 4,  8],
        [ 5, 10]],
​
       [[ 6, 12],
        [ 7, 14],
        [ 8, 16]]])
"""

列组合:

np.column_stack(): 对应列相组合

# 列组合
oned = np.arange(4)
print(oned)
twice_oned = 2*oned
print(twice_oned)
np.column_stack((oned, twice_oned))
"""
运行结果:
[0 1 2 3]
[0 2 4 6]
array([[0, 0],
       [1, 2],
       [2, 4],
       [3, 6]])
"""

行组合:

np.row_stack(): 对应的行进行组合
 

# 行组合
np.row_stack((oned, twice_oned))
"""
运行结果:
array([[0, 1, 2, 3],
       [0, 2, 4, 6]])
"""

16、数组的分割

水平分割:np.hsplit()

# 数组的分割
print(a)
np.hsplit(a, 3) # 水平分割
np.split(a, 3, axis=1) # 等价上式
"""
运行结果:
a: [[0 1 2][3 4 5][6 7 8]]
​
分割后的数组:
[array([[0],[3],[6]]), 
  array([[1],[4],[7]]), 
  array([[2],[5],[8]])]
"""

 

垂直分割:np.vsplit()

# 垂直分割
np.vsplit(a, 3)
np.split(a, 3, axis=0) # 等价上式
"""
运行结果:
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
"""

深度分割:np.dsplit()

# 深度分割
c = np.arange().reshape(3, 3, 3)
print(c)
np.dsplit(c, 3)
"""
运行结果:
[[[ 0  1  2] [ 3  4  5][ 6  7  8]]
  [[ 9 10 11][12 13 14][15 16 17]]
  [[18 19 20] [21 22 23] [24 25 26]]]
 
 [array([[[ 0], [ 3], [ 6]],
          [[ 9], [12], [15]],
          [[18], [21], [24]]]), 
  array([[[ 1], [ 4], [ 7]],
        [[10], [13],  [16]],
        [[19], [22], [25]]]),
   array([[[ 2], [ 5], [ 8]],
        [[11], [14], [17]],
        [[20], [23], [26]]])]
"""

17、对复数进行操作

# 对复数做操作
b1 = np.array([1.j+1,2.j+3])
print(b1)
re = b1.real # 给出复数数组的实部
ig = b1.imag  # 给出复数数组的虚部
print("re:",re)
print("ig:",ig)
"""
运行结果:
[1.+1.j 3.+2.j]
re: [1. 3.]
ig: [1. 2.]
"""

18、数组转换为列表

# 数组的转换
# 将数组转换为列表
b1.tolist()
"""
运行结果:
[(1+1j), (3+2j)]
"""

好了以上就是我们常用的numpy函数,占时整理了这些,还有很多我没写到的,大家可以在numpy api手册上查看,在后期我还会更新一些numpy, pandas, matplotlib, 以及seaborn的文章。

 

如果文章中有什么错误,或者不足的地方,大家可以留言指出, 谢谢!

 

注意:微信扫一扫下方二维码,后台回复“numpy1”即可获取代码^_^

整理不易,希望大家可以多多点击在看哦~谢谢大家了!!!

 

以上是关于数据分析————numpy基础的主要内容,如果未能解决你的问题,请参考以下文章

在numpy的范围内生成随机日期

内置范围或 numpy.arange:哪个更有效?

如何使用 numpy 在频率范围内产生噪声?

如何将 NumPy 数组标准化到一定范围内?

在 x 范围内运行 y 值的中位数

Numpy学习