数据分析 — Numpy 数组处理

一、简介

1、概念

NumPy(Numerical Python)是一个用于科学计算的 Python 库,提供了多维数组对象(ndarray)以及数学函数,用于处理大规模数据集和执行数值计算。

2、优点

当数据量达到一定级别后,NumPy 计算会比原生 Python 快。

import time
start_time = time.time()
numbers = list(range(1, 1000001))
total = sum(numbers)
end_time = time.time()
print("原生 Python 计算100万个元素的和耗时:", end_time - start_time)
import time
import numpy as np
start_time = time.time()
numbers = np.arange(1, 1000001)
total = np.sum(numbers)
end_time = time.time()
print("NumPy 计算100万个元素的和耗时:", end_time - start_time)

3、特点

Numpy 的主要对象是同种元素的多维数组。这是⼀个所有的元素都是⼀种类型、通过⼀个正整数元组索引的元素表格(通常是元素是数字)。在 Numpy 中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。

NumPy 数组是⼀个多维数组对象,称为 ndarray。由两部分组成:实际的数据描述这些数据的元数据

4、作用

可以构造⼀个比普通列表大的多的数组,并且可以很灵活的对其中所有的元素进行并行化操作。

5、引用

pip install numpy
import numpy as np # 导入 NumPy 库并使用别名 np

二、创建数组

1、创建一维数组

一维数组是最简单的数组形式,也被称为向量,它只有一个维度,即行(或列)。

一维数组类似于 Python 中的列表,但它可以包含相同类型的数据元素。

一维数组在数学和计算中常用于表示一系列数据点或向量。

创建方式

  • 直接传入列表的方式
import numpy as np  # 导入 NumPy 库并使用别名 np
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1)  # [1 2 3 4 5]
  • 传入 range 生成序列
import numpy as np  # 导入 NumPy 库并使用别名 np
arr2 = np.array(range(1, 6))
print(arr2)  # [1 2 3 4 5]
  • 使用 numpy 自带的 np.arange() 生成数组
import numpy as np  # 导入 NumPy 库并使用别名 np
# np.arange(起始索引,结束索引,步长)
arr3 = np.arange(1, 6, 2)
print(arr3)  # [1 3 5]
  • 使用 np.linspace() 生成等间隔的数组
import numpy as np  # 导入 NumPy 库并使用别名 np
# np.linspace(起始索引,结束索引,步长)
arr4 = np.linspace(1, 5, num=5)
print(arr4)  # [1. 2. 3. 4. 5.]

3、创建二维数组

  • 二维数组是具有两个维度的数据结构,通常表示矩阵。
  • 第一个维度表示行数,第二个维度表示列数。
  • 二维数组在数学和计算中用于表示表格数据、图像、矩阵等多种数据结构。
import numpy as np  # 导入 NumPy 库并使用别名 np
# 创建包含2行3列的二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
# [[1 2 3]
#  [4 5 6]]

# 创建一个2x3的二维数组,其中每个元素都是0
arr = np.array([[0, 0, 0], [0, 0, 0]])
print(arr)
# [[0 0 0]
#  [0 0 0]]

# 创建一个2x3的全0二维数组
arr = np.zeros((2, 3))
print(arr)
# [[0. 0. 0.]
#  [0. 0. 0.]]

# 创建一个2x3的全1二维数组
arr = np.ones((2, 3))
print(arr)
# [[1. 1. 1.]
#  [1. 1. 1.]]

# 创建一个2x2的单位矩阵
arr = np.eye(2)
print(arr)
# [[1. 0.]
#  [0. 1.]]

三、属性和数组运算

1、基本属性

  • 元素个数:size
  • 元素类型:dtype
  • 元素字节大小:itemsize
  • 秩:ndim
  • 维度:shape
  • 元素缓冲区:data
import numpy as np  # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
print(arr)  # [1 2 3 4 5]

size = arr.size
print(size)  # 5

dtype = arr.dtype
print(dtype)  # int32

itemsize = arr.itemsize
print(itemsize)  # 4

dim = arr.ndim
print(dim)  # 1

shape = arr.shape
print(shape)  # (5,)

data = arr.data
print(data)  # <memory at 0x0000029E7F205C00>

2、数据类型

NumPy 支持多种数据类型,如整数、浮点数、布尔值等。可以使用 dtype 参数指定数据类型。

类型 说明
bool 用一个字节存储的布尔类型(True 或 False)
int 由所在平台决定其大小的整数(一般为 int32 或 int64)
int8 一个字节大小的整数,范围为 -128 到 127
int16 两个字节大小的整数,范围为 -32768 到 32767
int32 四个字节大小的整数,范围为 -2^31 到 2^32-1
int64 八个字节大小的整数,范围为 -2^63 到 2^63-1
uint8 一个字节大小的无符号整数,范围为 0 到 255
uint16 两个字节大小的无符号整数,范围为 0 到 65535
uint32 四个字节大小的无符号整数,范围为 0 到 2^32-1
uint64 八个字节大小的无符号整数,范围为 0 到 2^64-1
float16 半精度浮点数,16 位,正负号 1 位,指数 5 位,精度 10 位
float32 单精度浮点数,32 位,正负号 1 位,指数 8 位,精度 23 位
float64 或 float 双精度浮点数,64 位,正负号 1 位,指数 11 位,精度 52 位
complex64 复数,分别用两个 32 位浮点数表示实部和虚部
complex128 或 complex 复数,分别用两个 64 位浮点数表示实部和虚部
import numpy as np  # 导入 NumPy 库并使用别名 np
# 创建指定数据类型的数组
arr = np.array([1, 2, 3], dtype=np.float32)
print(arr)  # [1. 2. 3.]

3、数组运算

import numpy as np  # 导入 NumPy 库并使用别名 np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
# [[1 2 3]
#  [4 5 6]]
print(arr + arr)
# [[ 2  4  6]
#  [ 8 10 12]]
print(arr - arr)
# [[0 0 0]
#  [0 0 0]]
print(arr * arr)
# [[ 1  4  9]
#  [16 25 36]]
print(arr / arr)
# [[1. 1. 1.]
#  [1. 1. 1.]]

广播机制

import numpy as np  # 导入 NumPy 库并使用别名 np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(1 / arr)
# [[1.         0.5        0.33333333]
#  [0.25       0.2        0.16666667]]

四、索引和切片

1、基本索引

import numpy as np  # 导入 NumPy 库并使用别名 np

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

# 获取第三个元素
element = arr[2]
print(element)  # 3

2、多维数组索引

import numpy as np  # 导入 NumPy 库并使用别名 np

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

# 获取第二行第三列的元素
element_2d = arr_2d[1, 2]
print(element_2d)  # 6

3、基本切片

import numpy as np  # 导入 NumPy 库并使用别名 np

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

# 获取索引1到3的子数组
arr_slice = arr[1:4]  # 左闭右开
print(arr_slice)  # [2, 3, 4]

4、多维数组切片

import numpy as np  # 导入 NumPy 库并使用别名 np

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

# 获取所有行的第二列及之后的元素
arr_2d_slice = arr_2d[:, 1:]  # 逗号前是行,逗号后是列,:表示所有
print(arr_2d_slice)
# [[2, 3],
#  [5, 6]]

5、布尔索引

import numpy as np  # 导入 NumPy 库并使用别名 np

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

# 返回一个布尔数组,表示大于3的元素
bool_index = arr > 3  
subset_by_bool = arr[bool_index]
print(subset_by_bool)  # [4, 5]

6、花式索引

import numpy as np  # 导入 NumPy 库并使用别名 np

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

# 获取索引为第0,2,4的子数组
indices = np.array([0, 2, 4])
fancy_indexing = arr[indices]
print(fancy_indexing)  # [1, 3, 5]

7、修改元素值

import numpy as np  # 导入 NumPy 库并使用别名 np

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

# 将索引1的元素修改为10
arr[1] = 10
print(arr)  # [ 1 10  3  4  5]
import numpy as np  # 导入 NumPy 库并使用别名 np

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

# 将第一行第二列的元素修改为20
arr_2d[0, 1] = 20
print(arr_2d)
# [[ 1 20  3]
#  [ 4  5  6]]

索引和切片的区别总结:

  • 返回类型: 索引返回的是单个元素值,而切片返回的是数组的一个视图。
  • 是否影响原数组: 对索引得到的元素的修改不会影响原数组,而对切片的修改会影响原数组。
  • 用法: 索引用于获取特定位置的元素,而切片用于获取数组的子集。

五、统计函数

1、均值

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
mean_value = np.mean(arr)
print(mean_value)  # 3.0

2、中位数

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
median_value = np.median(arr)
print(median_value)  # 3.0

3、总和

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
sum_value = np.sum(arr)
print(sum_value)  # 15

4、乘积

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
product_value = np.prod(arr)
print(product_value)  # 120

5、最小值

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
min_value = np.min(arr)
print(min_value)  # 1

6、最大值

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
max_value = np.max(arr)
print(max_value)  # 5

7、标准差

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
std_deviation = np.std(arr)
print(std_deviation)  # 1.4142135623730951

8、方差

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
variance = np.var(arr)
print(variance)  # 2.0

9、协方差

import numpy as np  # 导入 NumPy 库并使用别名 np

arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([5, 4, 3, 2, 1])
covariance_matrix = np.cov(arr1, arr2)
print(covariance_matrix)
# [[ 2.5 -2.5]
#  [-2.5  2.5]]

10、百分位数

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
percentile_50 = np.percentile(arr, 50)
print(percentile_50)  # 3.0

11、直方图

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
histogram_values, bin_edges = np.histogram(arr, bins=5)
print(histogram_values, bin_edges)  # [1 1 1 1 1] [1.  1.8 2.6 3.4 4.2 5. ]

12、相关系数

import numpy as np  # 导入 NumPy 库并使用别名 np

arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([5, 4, 3, 2, 1])
correlation_matrix = np.corrcoef(arr1, arr2)
print(correlation_matrix)
# [[ 1. -1.]
#  [-1.  1.]]

六、按条件筛选

1、基本用法

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
indices = np.where(arr > 2)
print(indices)  # (array([2, 3, 4], dtype=int64),)

2、返回满足条件的元素

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
values = arr[np.where(arr > 2)]
print(values)  # [3 4 5]

3、替换满足条件的元素

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
arr[np.where(arr > 2)] = 0  # 大于2的返回0
print(arr)  # [1 2 0 0 0]

4、使用三元表达式

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
new_arr = np.where(arr > 2, 0, arr)  # 大于2的返回0
print(new_arr)  # [1 2 0 0 0]

5、多条件选择

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([1, 2, 3, 4, 5])
indices = np.where((arr > 2) & (arr < 5))
print(indices)  # (array([2, 3], dtype=int64),)

6、返回满足条件的元素的坐标

import numpy as np  # 导入 NumPy 库并使用别名 np

arr = np.array([[1, 2, 3], [4, 5, 6]])
coordinates = np.where(arr > 2)
print(coordinates)  # (array([0, 1, 1, 1], dtype=int64), array([2, 0, 1, 2], dtype=int64))

arr = np.array([[1, 2, 3], [4, 5, 6]])
coordinates = arr[np.where(arr > 2)]
print(coordinates)  # [3 4 5 6]

记录学习过程,欢迎讨论交流,尊重原创,转载请注明出处~

相关推荐

  1. 数据分析Numpy 数组处理

    2024-02-15 15:22:02       27 阅读
  2. python数据处理numpy

    2024-02-15 15:22:02       17 阅读
  3. 【Python】数据处理NumPy

    2024-02-15 15:22:02       5 阅读
  4. 数据分析NumPy

    2024-02-15 15:22:02       36 阅读
  5. 数据分析NumPy

    2024-02-15 15:22:02       37 阅读
  6. 3 数据分析--Numpy

    2024-02-15 15:22:02       17 阅读
  7. 数据分析 -- numpy

    2024-02-15 15:22:02       15 阅读
  8. 数据分析-numpy

    2024-02-15 15:22:02       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-15 15:22:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-15 15:22:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-15 15:22:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-15 15:22:02       20 阅读

热门阅读

  1. Spring

    Spring

    2024-02-15 15:22:02      35 阅读
  2. 1+X运维试题样卷D卷(初级)

    2024-02-15 15:22:02       27 阅读
  3. DOCKER 给运行中的容器添加映射端口

    2024-02-15 15:22:02       31 阅读
  4. OpenStack手动迁移虚拟机

    2024-02-15 15:22:02       29 阅读
  5. 蓝桥杯刷题--python-5

    2024-02-15 15:22:02       41 阅读
  6. openJudge | 过滤多余的空格 C语言

    2024-02-15 15:22:02       29 阅读
  7. 【数据结构与算法】判断二叉树是否完全二叉树

    2024-02-15 15:22:02       31 阅读