【Python爬虫与数据分析】NumPy进阶——数组操作与运算

这篇具有很好参考价值的文章主要介绍了【Python爬虫与数据分析】NumPy进阶——数组操作与运算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、NumPy数组操作

1. ndarray更改形状

2. ndarray转置

3. ndarray组合

4. ndarray拆分

5. ndarray排序

二、NumPy数组运算

1. 基本运算

2. 逻辑函数

3. 数学函数

三、日期时间的表示和间隔

1. 日期时间的表示——datetime64

2. 日期时间的计算——timedelta64

3. datetime64与datetime的转换


一、NumPy数组操作

1. ndarray更改形状

在对数组进行操作时,为了满足格式和计算的要求通常会改变其形状。
numpy.ndarray.shape 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim属性(秩)。

shape:通过列表和元组重定义数组形状

import numpy as np

a1 = np.arange(12)
a1
# array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

a1.shape
# (12,)

a1.shape = [3, 4]
a1
# array([[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [ 8,  9, 10, 11]])

a1.shape = (4, 3)
# array([[ 0,  1,  2],
#        [ 3,  4,  5],
#        [ 6,  7,  8],
#        [ 9, 10, 11]])

reshape:不改变原数组形状,返回一个临时数组

import numpy as np

a1 = np.arange(12)
# array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

a1.shape = [3, 4]
# array([[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [ 8,  9, 10, 11]])

a1.reshape(2, 2, 3)
# array([[[ 0,  1,  2],
#         [ 3,  4,  5]],
#
#        [[ 6,  7,  8],
#         [ 9, 10, 11]]])

a1
# array([[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [ 8,  9, 10, 11]])

# -1表示任意个元素,(2, -1)表示两行任意列
a1.reshape(2, -1)
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]]


np.reshape(a1, [3, 2, 2])
# array([[[ 0,  1],
#         [ 2,  3]],
#
#        [[ 4,  5],
#         [ 6,  7]],
#
#        [[ 8,  9],
#         [10, 11]]])

a1
# array([[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [ 8,  9, 10, 11]])

resize:将数组转换成指定的形状,会直接修改数组本身,并且不会返回任何值

import numpy as np

a1 = np.arange(12)
# array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

a1.shape = [3, 4]
# array([[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [ 8,  9, 10, 11]])

a1.resize(2, 2, 3)
a1
# array([[[ 0,  1,  2],
#         [ 3,  4,  5]],
#
#        [[ 6,  7,  8],
#         [ 9, 10, 11]]])

numpy.ndarray.flat 将数组转换为一维的迭代器,可以用for访问数组每一个元素。

import numpy as np

arr1 = np.arange(24).reshape(4, 6)
arr1
# array([[ 0, 1, 2, 3, 4, 5],
#        [ 6, 7, 8, 9, 10, 11],
#        [12, 13, 14, 15, 16, 17],
#        [18, 19, 20, 21, 22, 23]])

arr2 = arr1.flat
arr2 
# <numpy.flatiter at 0x1f6d67973f0>

for i in arr2:
    print(i, end=' ')
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

numpy.ndarray.flatten([order='C']) 将数组的副本转换为一维数组,并返回, flatten()函数返回
的是拷贝。

import numpy as np

arr1 = np.arange(24).reshape(4, 6)
arr1
# array([[ 0, 1, 2, 3, 4, 5],
#        [ 6, 7, 8, 9, 10, 11],
#        [12, 13, 14, 15, 16, 17],
#        [18, 19, 20, 21, 22, 23]])

arr2 = arr1.flatten()
arr2
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])

arr2[2] = 0
arr1
# array([[ 0, 1, 2, 3, 4, 5],
#        [ 6, 7, 8, 9, 10, 11],
#        [12, 13, 14, 15, 16, 17],
#        [18, 19, 20, 21, 22, 23]])

2. ndarray转置

numpy.transpose()、numpy.ndarray.T ,对换数组的维度,numpy.ndarray.T相当于numpy.transpose在二维矩阵情况下的一种简便表达。

import numpy as np

arr = np.random.randint(0, 10, size=(3, 4))
print(arr)
# [[8 7 7 7]
#  [7 1 9 1]
#  [4 1 4 1]]

print(arr.T)
# [[8 7 4]
#  [7 1 1]
#  [7 9 4]
#  [7 1 1]]

print(arr)
# [[8 7 7 7]
#  [7 1 9 1]
#  [4 1 4 1]]

print(np.transpose(arr))
# [[2 9 1]
#  [7 0 0]
#  [0 2 7]
#  [2 6 6]]

print(arr)
# [[8 7 7 7]
#  [7 1 9 1]
#  [4 1 4 1]]

3. ndarray组合

在数据分析中,数组组合应该是最常见的操作。数组组合的方式大致可分为两种:一种是沿现有轴(维度)组合数组;另一种是沿新轴(新的维度)组合数组。

  • numpy.concatenate((a1, a2, ...), axis=0, out=None) :沿现有轴连接一系列数组。
  • numpy.stack(arrays, axis=0, out=None):沿新轴连接一系列数组。
  • numpy.vstack(tup):水平(按列)顺序堆叠数组
  • numpy.hstack(tup):垂直(行)按顺序堆叠数组
import numpy as np

a1 = np.arange(12).reshape(3, 4)
a2 = np.arange(12, 24).reshape(3, 4)

# numpy.concatenate([a1, a2, ...], axis=0, out=None) 沿现有轴连接一系列数组
a3 = np.concatenate([a1, a2])
print(a3)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]
#  [12 13 14 15]
#  [16 17 18 19]
#  [20 21 22 23]]

a4 = np.concatenate([a1, a2], axis=1)       # axis默认为0
print(a4)
# [[ 0  1  2  3 12 13 14 15]
#  [ 4  5  6  7 16 17 18 19]
#  [ 8  9 10 11 20 21 22 23]]

# numpy.stack(arrays, axis=0, out=None) 沿新轴连接一系列数组,stack为增加维度的拼接
a5 = np.stack([a1, a2])
print(a5)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

a6 = np.stack([a1, a2], axis=1)
print(a6)
# [[[ 0  1  2  3]
#   [12 13 14 15]]
#
#  [[ 4  5  6  7]
#   [16 17 18 19]]
#
#  [[ 8  9 10 11]
#   [20 21 22 23]]]

a7 = np.stack([a1, a2], axis=2)
print(a7)
# [[[ 0 12]
#   [ 1 13]
#   [ 2 14]
#   [ 3 15]]
#
#  [[ 4 16]
#   [ 5 17]
#   [ 6 18]
#   [ 7 19]]
#
#  [[ 8 20]
#   [ 9 21]
#   [10 22]
#   [11 23]]]

# hstack(), vstack() 分别表示水平和竖直的拼接方式。在数据维度等于1时,比较特殊。
# 而当维度大于或等于2时,它们的作用相当于 concatenate ,用于在已有轴上进行操作。
a8 = np.hstack([a1, a2])
print(a8)
# [[ 0  1  2  3 12 13 14 15]
#  [ 4  5  6  7 16 17 18 19]
#  [ 8  9 10 11 20 21 22 23]]

a9 = np.vstack([a1, a2])
print(a9)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]
#  [12 13 14 15]
#  [16 17 18 19]
#  [20 21 22 23]]

a0 = np.arange(5)
# [0 1 2 3 4]

a10 = np.hstack([a0, a0])
print(a10)
# [0 1 2 3 4 0 1 2 3 4]

a11 = np.vstack([a0, a0])
print(a11)
# [[0 1 2 3 4]
#  [0 1 2 3 4]]

4. ndarray拆分

numpy.split(ary, indices_or_sections, axis) 沿特定的轴将数组分割为子数组

  • ary:要切分的数组。
  • indices_or_sections:如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)。
  • axis:沿着哪个维度进行切分,默认为0,横向切分。为1时,纵向切分。
import numpy as np

a1 = np.arange(9)

# 一维数组
a2 = np.split(a1, 3)        # 平均切分,注意整除
print(a2)
# [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]

a3 = np.split(a1, [3, 8])
print(a3)
# [array([0, 1, 2]), array([3, 4, 5, 6, 7]), array([8])]

# 二维数组
a1 = np.arange(12).reshape(3, 4)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

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

a3 = np.split(a1, [1, 3])
print(a3)
# [array([[0, 1, 2, 3]]),
#  array([[4, 5, 6, 7],
#         [8, 9, 10, 11]]),
#  array([], shape=(0, 4), dtype=int32)]

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

5. ndarray排序

numpy.sort() 指定轴进行排序。默认是使用数组的最后一个轴进行排序。
ndarray.sort() 这个方法会直接影响到原来的数组,而不是返回一个新的排序后的数组。

import numpy as np

a1 = np.random.randint(0, 12, size=(3, 4))
print(a1)
# [[ 3  8  1  7]
#  [ 0  4 10  3]
#  [10  5  8 11]]

# numpy.sort 指定轴排序,不改变原数组
print(np.sort(a1))          # 默认axis=1, 行排序
# [[ 1  3  7  8]
#  [ 0  3  4 10]
#  [ 5  8 10 11]]

print(np.sort(a1, axis=0))  # 指定axis=0, 列排序
# [[ 0  4  1  3]
#  [ 3  5  8  7]
#  [10  8 10 11]]

print(-np.sort(-a1))         # 降序排序
# [[ 8  7  3  1]
#  [10  4  3  0]
#  [11 10  8  5]]

# ndarray.sort 直接修改原数组
a1.sort()
print(a1)
# [[ 1  3  7  8]
#  [ 0  3  4 10]
#  [ 5  8 10 11]]

a1.sort(axis=0)
print(a1)
# [[ 0  3  4  8]
#  [ 1  3  7 10]
#  [ 5  8 10 11]]

# numpy.argsort 返回排序后的下标值

二、NumPy数组运算

1. 基本运算

  • Numpy数组不需要写循环即可对数据执行批量运算
  • NumPy用户称其为矢量化(vectorization)

大小相等的数组之间的任何算术运算都会将运算应用到元素级:

import numpy as np

arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[2, 4, 6], [1, 3, 5]])

print(arr1 + arr2)
# [[ 3  6  9]
#  [ 5  8 11]]

print(arr1 - arr2)
# [[-1 -2 -3]
#  [ 3  2  1]]

print(arr1 * arr2)
# [[ 2  8 18]
#  [ 4 15 30]]

print(arr1 / arr2)
# [[0.5      0.5        0.5]
#  [4.       1.66667    1.2]]

print(arr1 ** 2)
# [[ 1  4  9]
#  [16 25 36]]

2. 逻辑函数

  • numpy.all() 函数用于判断整个数组中的元素的值是否全部满足条件,如果满足条件返回True,否则返回False。
  • numpy.any() 相当于或(or)操作,任意一个元素为True,输出为True
  • numpy.isnan() 函数用于判断数据是否为 NaN
  • numpy.isinf() 函数用于判断数据是否为 inf
import numpy as np

arr1 = np.arange(5)
arr2 = np.copy(arr1)
# [0 1 2 3 4]

print(np.all(arr1 == 0))        # False
print(np.all(arr1 == arr2))     # True

arr1[1] = 0
print(arr1 == arr2)             # [True False True True True]
print(np.all(arr1 == arr2))     # False
print(np.any(arr1 == arr2))     # True
print(np.any(arr1 == 0))        # True
print(np.any(arr1 == 10))       # False

3. 数学函数

函数名 含义 示例 结果
numpy.add np.add(np.array([1, 2, 3,4]), 1) array([2, 3, 4, 5])
numpy.subtract np.subtract(np.array([1, 2, 3, 4]), 1) array([0, 1, 2, 3])
numpy.multiply np.multiply(np.array([1, 2, 3, 4]), 2) array([2, 4, 6, 8])
numpy.divide np.divide(np.array([1, 2, 3, 4]), 2) array([0.5, 1. , 1.5, 2.])
numpy.power

power(x, y)

计算 x 的 y 次方

np.power(2, 3) 8
numpy.sqrt 计算各元素的平
方根
np.sqrt([1, 4, 9]) array([1., 2., 3.])
numpy.square 计算各元素的平
np.square([1, 2, 3]) array([1, 4, 9])
numpy.sum 各元素求和 np.sum(np.array([1, 2, 3])) 6
numpy.cumsum 各元素累加和 np.cumsum(np.array([1, 2, 3])) array([1, 3, 6])
numpy.prod 各元素的乘积 np.prod(np.array([1, 2, 3, 4])) 24
numpy.cumprod 各元素累积乘积 np.prod(np.array([1, 2, 3, 4])) array([ 1, 2, 6, 24])
numpy.min 最小的元素 np.min(np.array([1, 2, 3, 4])) 1
numpy.max 最大的元素 np.max(np.array([1, 2, 3, 4])) 4
numpy.mean 元素的均值 np.mean(np.array([1, 2, 3, 4])) 2.5
numpy.around

四舍五入

可指定精度

np.around(np.array([1.2, 2.6, 3.1, 4.7])) array([1., 3., 3., 5.])
numpy.ceil 向上取整 np.ceil(np.array([-2.1, -1.7,1.2, 2.6, 3.1])) array([-2., -1., 2., 3., 4.])
numpy.floor 向下取整 np.floor(np.array([-2.1, -1.7, 1.2, 2.6, 3.1])) array([-3., -2., 1., 2., 3.])
numpy.exp 返回e的幂次方 np.exp(np.array([1, 2])) array([2.718, 7.389])
numpy.log

自然对数

以e为底

np.log(np.e) 1.0

三、日期时间的表示和间隔

在 Numpy中,我们可以很方便的将字符串转换成时间日期类型datetime64(datetime已被Python 包含的日期时间库所占用)。

日期单位 代码含义 时间单位 代码含义
Y h 小时
M m 分钟
W s
D ms 毫秒

1. 日期时间的表示——datetime64

字符串转时间类型时,NumPy会根据字符串自动选择对应的单位,也可以强制指定使用单位。

import numpy as np

dt1 = np.datetime64('2023-06-01')
print(dt1, dt1.dtype)   # 2023-06-01 datetime64[D]

dt2 = np.datetime64('2023-06')
print(dt2, dt2.dtype)   # 2023-06 datetime64[M]

dt3 = np.datetime64('2023-06-01 10')
print(dt3, dt3.dtype)   # 2023-06-01T10 datetime64[h]

dt4 = np.datetime64('2023-06-01 10:30:59')
print(dt4, dt4.dtype)   # 2023-06-01T10:30:59 datetime64[s]

dt5 = np.datetime64('2023', 'D')
print(dt5, dt5.dtype)   # 2023-01-01 datetime64[D]

dt6 = np.datetime64('2023-01-01 23:00:00', 'h')
print(dt6, dt6.dtype)   # 2023-01-01T23 datetime64[h]

dt_lst = np.array(['2023-06', '2022-10-20', '2021', '2023-03-10 17:50:20'], dtype='datetime64')
print(dt_lst, dt_lst.dtype)
# ['2023-06-01T00:00:00' '2022-10-20T00:00:00' '2021-01-01T00:00:00' '2023-03-10T17:50:20'] datetime64[s]

2. 日期时间的计算——timedelta64

timedelta64 表示两个 datetime64 之间的差。

相减后timedelta64的单位与两个 datetime64 中的较小的单位保持一致。文章来源地址https://www.toymoban.com/news/detail-553952.html

import numpy as np

dt1 = np.datetime64('2023-01-01')

dt2 = dt1 - np.datetime64('2022-01-01')
dt3 = dt1 - np.datetime64('2022-12-01 12')
dt4 = dt1 - np.datetime64('2021-06')

print(f"{dt2}, {dt3}, {dt4}")
# 365 days, 732 hours, 579 days

# 不支持 M 和 Y 的运算
dt5 = dt1 + np.timedelta64(10, 'D')
dt6 = dt1 + np.timedelta64(10, 'h')
dt7 = dt1 - np.timedelta64(10, 'm')
dt8 = dt1 - np.timedelta64(10, 's')
print(f"{dt5}, {dt6}, {dt7}, {dt8}")
# 2023-01-11, 2023-01-01T10, 2022-12-31T23:50, 2022-12-31T23:59:50

3. datetime64与datetime的转换

import numpy as np
import datetime

dt1 = datetime.datetime(year=2022, month=10, day=1, hour=10, minute=30, second=30)
dt64 = np.datetime64(dt1, 's')
print(dt64, dt64.dtype)
# 2022-10-01T10:30:30 datetime64[s]

dt2 = dt64.astype(datetime.datetime)
print(dt2, type(dt2))
# 2022-10-01 10:30:30 <class 'datetime.datetime'>

到了这里,关于【Python爬虫与数据分析】NumPy进阶——数组操作与运算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据分析 — Numpy 数组处理

    NumPy(Numerical Python)是一个用于 科学计算 的 Python 库,提供了多维数组对象(ndarray)以及数学函数,用于 处理大规模数据集和执行数值 计算。 当数据量达到一定级别后,NumPy 计算会比原生 Python 快。 Numpy 的主要对象是 同种元素 的多维数组。这是⼀个所有的元素都是⼀种类

    2024年02月22日
    浏览(39)
  • 【数据分析之道-NumPy(二)】多种方式创建数组

    ✍ 作者简介: i阿极 ,CSDN Python领域新星创作者, 专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》 ,本专栏针对大学生、初级数据分析工程师精心打造,对python基础知识点逐一击破,不断学习,提升自我。 ✍ 订阅后,可以阅读《数据分析之道》中全部文章内容

    2024年02月01日
    浏览(84)
  • 【Python数据分析】数据分析之numpy基础

    实验环境:建立在Python3的基础之上 numpy提供了一种数据类型,提供了数据分析的运算基础,安装方式 导入numpy到python项目 本文以案例的方式展示numpy的基本语法,没有介绍语法的细枝末节,笔者认为通过查阅案例就能掌握基本用法。 numpy数组的基本概念 numpy默认所有元素具有

    2024年02月10日
    浏览(44)
  • [数据分析大全]基于Python的数据分析大全——Numpy基础

    NumPy 的全称为 Numeric Python,它是 Python 的第三方扩展包,主要用来计算、处理一维或多维数组。   步入8月了,7月时因为项目所需,自学了 深度学习 相关的内容,现在 已经把项目所需要的神经网络框架搭建起来了,输入输出也都归一化了,模拟误差也加上了,图像的参数

    2024年02月14日
    浏览(62)
  • 数据分析-python学习 (1)numpy相关

    内容为:https://juejin.cn/book/7240731597035864121的学习笔记 numpy数组创建 创建全0数组,正态分布、随机数组等就不说了,提供了相应的方法 通过已有数据创建有两种 arr1=np.array([1,2,3,4,5]) 或者data=np.loadtxt(‘C:/Users/000001_all.csv’,dtype=‘float’,delimiter=‘,’,skiprows=1) (data=np.genfromtxt(‘

    2024年02月13日
    浏览(40)
  • 【Python数据分析】numpy库的使用-上篇

    NumPy是一个用于科学计算的Python库,它提供了高性能的多维数组对象和用于处理这些数组的各种工具。NumPy的名称来自于“ Numerical Python ”的缩写。 NumPy的主要功能包括: 多维数组对象:NumPy提供了多维数组对象,称为 ndarray ,它是一个由同类型数据组成的表格。 ndarray 可以包

    2024年02月06日
    浏览(39)
  • 银行营销数据分析---Python(numpy、pandas、matplotlib)

    数据来源:kaggle银行营销数据 工具:Python、Jupyter Notebook 本项目采取的是kaggle银行营销的数据源,主要是预测客户是否会订购银行的产品,但是,这次我将 使用numpy、pandas、matplotlib数据分析三件套,基于源数据,深入分析影响银行三大业务—存款、贷款、营销产品的因素 ,

    2024年02月07日
    浏览(55)
  • python-数据分析-numpy、pandas、matplotlib的常用方法

    输出方式不同 里面包含的元素类型 使用 索引/切片 访问ndarray元素 切片 左闭右开 np.array(list) np.arange() np.random.randn() - - - 服从标准正态分布- - - 数学期望 μ - - - 标准方差 s 使用matplotlib.pyplot模块验证标准正态分布 np.random.randint(起始数,终止数(行,列)) 数据分析 - - - 数据清洗

    2024年02月10日
    浏览(94)
  • python数据分析学习笔记之matplotlib、numpy、pandas

    为了学习机器学习,在此先学习以下数据分析的matplotlib,numpy,pandas,主要是为自己的学习做个记录,如有不会的可以随时查阅。希望大家可以一起学习共同进步,我们最终都可以说:功不唐捐,玉汝于成。就算遇到困难也不要气馁,大声说:我不怕,我敏而好学!! 把大量

    2024年02月08日
    浏览(56)
  • Java进阶(3)——手动实现ArrayList & 源码的初步理解分析 & 数组插入数据和删除数据的问题

    1.ArrayList的结构分析,可迭代接口,是List的实现; 2.数组增加元素和删除元素的分析,何时扩容,如何扩容; 3.插入数据的复杂度O(N); 4.数组特点:查找和修改容易O(1);增加和删除复杂O(N); 增加元素 如果放不下怎么办?如何扩容? 扩容后如何操作? 扩容:每次为原来的

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包