Python数据处理之Numpy

简介: Python数据处理之Numpy

什么是Numpy?

NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。


如何安装Numpy?


博主用的Python3编译器,命令行下的安装为   pip3 install numpy

安装时如果遇到各种问题请移步 这里(英文不好可以使用Chrome对网页进行翻译)


Numpy的应用

Numpy的属性

首先我们来介绍几种简单的属性


ndim:维度

shape:行数和列数

size:元素个数


我们用下面这段代码来举例说明几种属性的应用情况

#array的用法下面会讲到

import numpy as np
array = np.array([[1,2,3],[2,3,4]])  #列表转化为矩阵
print(array)
print('维度:',array.ndim)  # 维度
print('行数,列数 :',array.shape)    # 行数和列数
print('元素个数:',array.size)   # 元素个数

输出结果如下

[[1 2 3]

[2 3 4]]

维度: 2

行数,列数 : (2, 3)

元素个数: 6


Numpy的array操作

在上面的一段代码中我们用到了array这个属性,该属性用于创建数组,它的几个属性如下


array:创建数组

dtype:指定数据类型

zeros:创建数据全为0

ones:创建数据全为1

empty:创建数据接近0

arrange:按指定范围创建数据

reshape:改变数据的形状

linspace:创建线段


代码应用

array:创建数组

a = np.array([2,3,4])  # 创键一个一维数组
b = np.array([[2,2,4],[2,3,4]])#创建一个2行3列的数组
print(a)
# 该数组为[2 3 4]

dtype:指定数据类型

a = np.array([2,3,4],dtype=np.int)
print(a.dtype)
# int 64
a = np.array([2,3,4],dtype=np.int32)
print(a.dtype)
# int32
a = np.array([2,3,4],dtype=np.float)
print(a.dtype)
# float64
a = np.array([2,3,4],dtype=np.float32)
print(a.dtype)
# float32

zeros:创建数据全为0

ones:创建数据全为1

empty:创建数据全为空(所创建的数据接近0)

a = np.zeros((3,4)) # 数据全为0,3行4列
a = np.ones((3,4),dtype = np.int)   # 数据为1,3行4列
a = np.empty((3,4)) # 数据为empty,3行4列

arrange:按指定范围创建数据

a = np.arange(10,100,2) # 10-100 的数据,2步长

reshape:改变数据的形状

a = np.arange(12).reshape((3,4))    # 3行4列,0到11

linspace:创建线段型数据

a = np.linspace(1,10,20)    # 开始端1,结束端10,且分割成20个数据,生成线段

Numpy的运算

我们先建立两个一维矩阵

import numpy as np
a=np.array([10,20,30,40])   # array([10, 20, 30, 40])
b=np.arange(4)              # array([0, 1, 2, 3])        上文中提到过的创建方法

不难看出我们建立的两个矩阵都是一行四列的对于一些普通的计算可以试着输入

c=a-b  # array([10, 19, 28, 37])
c=a+b   # array([10, 21, 32, 43])
c=a*b   # array([  0,  20,  60, 120])
c=b**2  # array([0, 1, 4, 9])  **在numpy中表示乘方

如果你想用到一些数学函数,比如三角函数

c=10*np.sin(a)  
# array([-5.44021111,  9.12945251, -9.88031624,  7.4511316 ])

或者进行一些逻辑判断

print(b<3)  
# array([ True,  True,  True, False], dtype=bool)

此处需要注意,正常情况下我们的判断用到了> < 但是判断是否相等的时候一定要用==而不是=

如果我们想对多维的矩阵进行操作


先对我们的矩阵进行一些修改

a=np.array([[1,1],[0,1]])
b=np.arange(4).reshape((2,2))
print(a)
# array([[1, 1],
#       [0, 1]])
print(b)
# array([[0, 1],
#       [2, 3]])

我们对矩阵进行乘法运算

c_dot = np.dot(a,b)
# array([[2, 4],
#       [2, 3]]

另一种表示方法

c_dot_2 = a.dot(b)
# array([[2, 4],
#       [2, 3]])

再来说一下对 sum(),min(),max()的使用

import numpy as np
a=np.random.random((2,4))
print(a)
#array[[0.44170864 0.55546057 0.20811773 0.31393565]
#      [0.77267586 0.37477637 0.57271214 0.91471081]]
print(np.sum(a))  #求和      4.154097777084038
print(np.min(a))  #求最小值  0.2081177326626824
print(np.max(a))  #求最大值  0.9147108137831268

如果你需要对行或者列进行查找运算,就需要在上述代码中为 axis 进行赋值。 当axis的值为0的时候,将会以列作为查找单元, 当axis的值为1的时候,将会以行作为查找单元。

对于刚才的例子我们继续查找

print("sum =",np.sum(a,axis=1))#sum = [1.51922259 2.63487519]
print("min =",np.min(a,axis=0))#min = [0.44170864 0.37477637 0.20811773 0.31393565]
print("max =",np.max(a,axis=1))#max = [0.55546057 0.91471081]

在平时的使用过程中,对应元素的索引也是很重要的,从下面的一个脚本开始

import numpy as np
A = np.arange(2,14).reshape((3,4)) 
# array([[ 2, 3, 4, 5]
#        [ 6, 7, 8, 9]
#        [10,11,12,13]])
print(np.argmin(A))    # 0
print(np.argmax(A))    # 11

argmin() 和 argmax() 两个函数分别对应着求矩阵中最小元素和最大元素的索引。


cumsum()函数:生成的每一项矩阵元素均是从原矩阵首项累加到对应项的元素之和。比如元素9,在cumsum()生成的矩阵中序号为3,即原矩阵中2,3,4三个元素的和。

print(np.cumsum(A)) 
# [2 5 9 14 20 27 35 44 54 65 77 90]

对应的累差运算函数:该函数计算的便是每一行中后一项与前一项之差。故一个3行4列矩阵通过函数计算得到的矩阵便是3行3列的矩阵。

print(np.diff(A))    
# [[1 1 1]
#  [1 1 1]
#  [1 1 1]]

nonzero()函数:这个函数将所有非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵。

print(np.nonzero(A))    
# (array([0,0,0,0,1,1,1,1,2,2,2,2]),array([0,1,2,3,0,1,2,3,0,1,2,3]))

同样的,我们可以对所有元素进行仿照列表一样的排序操作,但这里的排序函数仍然仅针对每一行进行从小到大排序操作:

import numpy as np
A = np.arange(14,2, -1).reshape((3,4)) 
# array([[14, 13, 12, 11],
#       [10,  9,  8,  7],
#       [ 6,  5,  4,  3]])
print(np.sort(A))    
# array([[11,12,13,14]
#        [ 7, 8, 9,10]
#        [ 3, 4, 5, 6]])

矩阵的转置

print(np.transpose(A))    
print(A.T)
# array([[14,10, 6]
#        [13, 9, 5]
#        [12, 8, 4]
#        [11, 7, 3]])
# array([[14,10, 6]
#        [13, 9, 5]
#        [12, 8, 4]
#        [11, 7, 3]])

clip函数()

函数的格式是clip(Array,Array_min,Array_max),顾名思义,Array指的是将要被执行用的矩阵,而后面的最小值最大值则用于让函数判断矩阵中元素是否有比最小值小的或者比最大值大的元素,并将这些指定的元素转换为最小值或者最大值。

print(A)
# array([[14,13,12,11]
#        [10, 9, 8, 7]
#        [ 6, 5, 4, 3]])
print(np.clip(A,5,9))    
# array([[ 9, 9, 9, 9]
#        [ 9, 9, 8, 7]
#        [ 6, 5, 5, 5]])

Numpy索引

在元素列表或者数组中,我们可以用如同a[2]一样的表示方法,同样的,在Numpy中也有相对应的表示方法:

import numpy as np
A = np.arange(3,15)
# array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
print(A[5])    # 8

二位矩阵

A = np.arange(3,15).reshape((3,4))
"""
array([[ 3,  4,  5,  6]
       [ 7,  8,  9, 10]
       [11, 12, 13, 14]])
"""
print(A[2])         
# [11 12 13 14]

实际上这时的A[2]对应的就是矩阵A中第三行(从0开始算第一行)的所有元素。

如果你想要表示具体的单个元素,可以仿照上述的例子:

print(A[1][1])      # 8
print(A[1, 1])      # 8

在Python的 list 中,我们可以利用:对一定范围内的元素进行切片操作,在Numpy中我们依然可以给出相应的方法:

print(A[1, 1:3])    # [8 9]

利用for函数进行打印:

for row in A:
    print(row)
"""    
[ 3,  4,  5, 6]
[ 7,  8,  9, 10]
[11, 12, 13, 14]
"""

如果想进行逐列打印,就需要稍稍变化一下:

for column in A.T:
    print(column)
"""  
[ 3,  7,  11]
[ 4,  8,  12]
[ 5,  9,  13]
[ 6, 10,  14]
"""

迭代输出

import numpy as np
A = np.arange(3,15).reshape((3,4))
print(A.flatten())   
# array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
for item in A.flat:
    print(item)
# 3
# 4
……
# 14

这一脚本中的flatten是一个展开性质的函数,将多维的矩阵进行展开成1行的数列。而flat是一个迭代器,本身是一个object属性。


Numpy array 合并

对于一个array的合并,我们可以想到按行、按列等多种方式进行合并。首先先看一个例子:

import numpy as np
A = np.array([1,1,1])
B = np.array([2,2,2])
print(np.vstack((A,B)))    # vertical stack
"""
[[1,1,1]
 [2,2,2]]
"""

vertical stack本身属于一种上下合并,即对括号中的两个整体进行对应操作

左右合并:

D = np.hstack((A,B))       # horizontal stack
print(D)
# [1,1,1,2,2,2]

当你的合并操作需要针对多个矩阵或序列时,借助concatenate函数可能会更好

C = np.concatenate((A,B,B,A),axis=0)
print(C)
"""
array([[1],
       [1],
       [1],
       [2],
       [2],
       [2],
       [2],
       [2],
       [2],
       [1],
       [1],
       [1]])
"""
D = np.concatenate((A,B,B,A),axis=1)
print(D)
"""
array([[1, 2, 2, 1],
       [1, 2, 2, 1],
       [1, 2, 2, 1]])
"""

axis参数很好的控制了矩阵的纵向或是横向打印,相比较vstack和hstack函数显得更加方便


Numpy array 分割


说完了合并我们自然要讲到如何去分割他们

建立一个3行4列的矩阵

A = np.arange(12).reshape((3, 4))
print(A)
"""
array([[ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11]])
"""

纵向分割

print(np.split(A, 2, axis=1))
"""
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]
"""

横向分割

print(np.split(A, 3, axis=0))
# [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]

不等量分割

print(np.array_split(A, 3, axis=1))
"""
[array([[0, 1],
        [4, 5],
        [8, 9]]), 
 array([[ 2],
        [ 6],
        [10]]), 
 array([[ 3],
        [ 7],
        [11]])]
"""
相关文章
|
22天前
|
数据采集 存储 数据处理
Python爬虫-数据处理与存储(一)
Python爬虫-数据处理与存储(一)
44 0
|
3天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
23天前
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
49 10
|
16天前
|
机器学习/深度学习 数据采集 算法
探索Python科学计算的边界:NumPy、Pandas与SciPy在大规模数据分析中的高级应用
【10月更文挑战第5天】随着数据科学和机器学习领域的快速发展,处理大规模数据集的能力变得至关重要。Python凭借其强大的生态系统,尤其是NumPy、Pandas和SciPy等库的支持,在这个领域占据了重要地位。本文将深入探讨这些库如何帮助科学家和工程师高效地进行数据分析,并通过实际案例来展示它们的一些高级应用。
38 0
探索Python科学计算的边界:NumPy、Pandas与SciPy在大规模数据分析中的高级应用
|
23天前
|
机器学习/深度学习 算法 数据挖掘
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧1
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
41 5
|
23天前
|
索引 Python
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧1
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
77 4
|
23天前
|
机器学习/深度学习 并行计算 大数据
【Python篇】深入挖掘 Pandas:机器学习数据处理的高级技巧
【Python篇】深入挖掘 Pandas:机器学习数据处理的高级技巧
47 3
|
23天前
|
机器学习/深度学习 算法 数据可视化
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧2
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
27 1
|
9天前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据处理与可视化——以气温数据分析为例
【10月更文挑战第12天】使用Python进行数据处理与可视化——以气温数据分析为例
95 0
|
9天前
|
数据挖掘 索引 Python
Python数据分析篇--NumPy--进阶
Python数据分析篇--NumPy--进阶
12 0