Python 第三方库 NumPy 一篇文章讲清楚Numpy的基础知识

Python 第三方库 NumPy:

  • NumPy 的全称是“ Numeric Python”,它是 Python 的第三方扩展包,主要用来计算、处理一维或多维数组
  • 在数组算术计算方面, NumPy 提供了大量的数学函数
  • NumPy 的底层主要用 C语言编写,因此它能够高速地执行数值计算
  • NumPy 还提供了多种数据结构,这些数据结构能够非常契合的应用在数组和矩阵的运算上

1 ndarray:

NumPy 定义了一个 n 维数组对象,简称 ndarray 对象,它是一个一系列相同类型元素组成的数组集合。数组中的每个元素都占有大小相同的内存块,您可以使用索引或切片的方式获取数组中的每个元素。

ndarray 对象采用了数组的索引机制,将数组中的每个元素映射到内存块上,并且按照一定的布局对内存块进行排列,常用的布局方式有两种,即按行或者按列。

主要特点

  • 多维数组:ndarray 可以表示任意维度的数组,包括一维、二维、三维等。
  • 同质数据类型:ndarray 中的所有元素必须是相同的数据类型。
  • 高效内存布局:ndarray 在内存中是连续存储的,这使得数组的访问和操作非常高效。
  • 丰富的功能和方法:ndarray 提供了丰富的数学函数和操作,如矩阵运算、线性代数、傅里叶变换等。

使用方式:

  • ndarray 是通过 array 函数或其他 NumPy 函数(如 zeros、ones、arange 等)创建的。
  • array 函数接受一个序列作为输入,并返回一个 ndarray 对象。

1.1 array创建对象:

通过 NumPy 的内置函数 array() 可以创建 ndarray 对象,其语法格式如下:

numpy.array(object, dtype = None, copy = True, order = None,ndmin = 0)

参数说明:

序号 参数 描述说明
1 object 表示一个数组序列
2 dtype 可选参数,通过它可以更改数组的数据类型
3 copy 可选参数,表示数组能否被复制,默认是 True
4 order 以哪种内存布局创建数组,有 3 个可选值,分别是 C(行序列)/F(列序列)/A(默认)
5 ndmin 用于指定数组的维度

代码实例:

#array()创建数组
#object:可以输入一个列表,可以是一维或多维
#dtype:指定数据类型,可选,如果不指定,则根据实际输入的数据类型自动判断
#order:指定内存的存储方式,C-按行存,F-按列存,默认C
#ndmin:指定数组的维度
a=np.array([1,2,3,4,5],dtype=np.int32,order="F")
print(a)

a=np.array([1,2,3],ndmin=2)
print(a)#创建了一个二维数组
# 学习产出:

2.2 zeros( )

可以创建一个指定大小的数组,数组元素全部以0填充

格式:

numpy.zeros(shape, dtype = float, order = 'C')
参数 描述
shape 数组形状
dtype 数据类型,可选
order ‘C’ 用于 C 的行数组,或者 ‘F’ 用于 FORTRAN 的列数组
a=np.zeros((2,3))

2.3 ones( )

可以创建指定大小的数组,数组元素以1填充

a=np.full((3,3),fill_value=5)
print(a)

2.4 full()

full()用于创建一个填充指定值的数组。

格式:

numpy.full(shape, fill_value, dtype=None, order='C')
参数 描述
shape 数组的形状(如 (2, 3) 表示 2 行 3 列的数组)
fill_value 填充的值
dtype 数组的数据类型(如 np.float32
order 数组的内存布局(如 'C' 表示 C 风格,'F' 表示 Fortran 风格)

代码实例:

#full方法根据指定的形状创建一个数组
#根据指定值填充
a=np.full((3,3),fill_value=5)
print(a)

2.5 arange()

arange()创建一个等差数列构成的数组
start:开始值,默认为0
stop:结束值,必填
step:步长,默认为1
dtype:数据类型,可选,默认为int

格式:

numpy.arange(start, stop, step, dtype)

根据 start 与 stop 指定的范围以及 step 设定的步长,生成一个 ndarray。

参数 描述
start 起始值,默认为 0
stop 终止值(不包含)
step 步长,默认为 1
dtype 返回 ndarray 的数据类型,如果没有提供,则会使用输入数据的类型

案例1:

a=np.arange(0,10,2)
print(a)
#start为0可以省略不写,step为1可以省略不写
a=np.arange(1,10,2)
print(a)

案例2:

import numpy as np
# 创建一个从 1 到 10 的数组
arr = np.arange(1, 11)
print(arr)
# 输出:
# [ 1  2  3  4  5  6  7  8  9 10]

案例3:

import numpy as np
# 创建一个从 0 到 9,步长为 2 的数组
arr = np.arange(0, 10, 2)
print(arr)
# 输出:
# [0 2 4 6 8]

案例4:

import numpy as np

# 创建一个从 10 到 0,步长为 -1 的数组
arr = np.arange(10, 0, -1)
print(arr)
# 输出:
# [10  9  8  7  6  5  4  3  2  1]

案例5:

import numpy as np
# 创建一个从 0 到 1,步长为 0.1 的浮点数数组
arr = np.arange(0, 1, 0.1)
print(arr)
# 输出:
# [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]

注意:

  • arange() 函数生成的数组不包含 stop 值。
  • 如果 step 为负数,则 start 必须大于 stop,否则生成的数组为空。
  • arange() 函数在处理浮点数时可能会出现精度问题,因为浮点数的表示和计算存在精度误差。

2.6 linspace

在指定的数值区间内,返回均匀间隔的一维等差数组,默认均分 50 份
start:开始值,必填
stop:结束值,必填
num:等分个数,默认为50
endpoint:是否包含结束值,默认为True
dtype:数据类型,可选,默认为floatar
默认包含终止值,如果为false不包含终止值

格式:

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数 描述
start 起始值,默认为 0
stop 终止值(默认包含)
num 表示数值区间内要生成多少个均匀的样本,默认值为 50
endpoint 默认为 True,表示数列包含 stop 终止值,反之不包含
retstep 表示是否返回步长。如果为 True,则返回一个包含数组和步长的元组;如果为 False,则只返回数组。默认为 False。
dtype 返回 ndarray 的数据类型,默认为 None,表示根据输入参数自动推断数据类型。

案例:

'''
    linspace 函数:
        1、在指定的数值区间内,返回均匀间隔的一维等差数组,默认均分 50 份
'''
a=np.linspace(0,10,2) #等分成n份
print(a)
a=np.arange(10,0,-1)
print(a)
#stop=(stop-start)////(num-1)

说明:以上几个函数通常用于创建数字类型的数组,也可以用于创建布尔、字符串等类型的数组。但更适合用于创建数字数组。

3.数据类型

NumPy 提供了比 Python 更加丰富的数据类型,如下所示:

序号 数据类型 语言描述
1 bool_ 布尔型数据类型(True 或者 False)
2 int_ 默认整数类型,类似于 C 语言中的 long,取值为 int32 或 int64
3 intc 和 C 语言的 int 类型一样,一般是 int32 或 int 64
4 intp 用于索引的整数类型(类似于 C 的 ssize_t,通常为 int32 或 int64)
5 int8 代表与1字节相同的8位整数。值的范围是-128到127
6 int16 代表 2 字节(16位)的整数。范围是-32768至32767
7 int32 代表 4 字节(32位)整数。范围是-2147483648至2147483647
8 int64 表示 8 字节(64位)整数。范围是-9223372036854775808至9223372036854775807
9 uint8 1字节(8位)无符号整数
10 uint16 2 字节(16位)无符号整数
11 uint32 4 字节(32位)无符号整数
12 uint64 8 字节(64位)无符号整数
13 float_ float64 类型的简写
14 float16 半精度浮点数,包括:1 个符号位,5 个指数位,10个尾数位
15 float32 单精度浮点数,包括:1 个符号位,8 个指数位,23个尾数位
16 float64 双精度浮点数,包括:1 个符号位,11 个指数位,52个尾数位
17 complex_ 复数类型,与 complex128 类型相同
18 complex64 表示实部和虚部共享 32 位的复数
19 complex128 表示实部和虚部共享 64 位的复数
20 str_ 表示字符串类型,等价于unicode_
21 bytes_ 表示字节串类型,基于字节
22 string_ 表示字节串类型,等价于bytes_,基于字节,NumPy 2.0以后版本被移除,使用bytes_代替
23 unicode_ 表示字节串类型,基于字符,NumPy 2.0以后版本被移除,使用str_`代替

3.1 数据类型对象

数据类型对象(Data Type Object)又称 dtype 对象,是用来描述与数组对应的内存区域如何使用。

1.可以在创建数组时指定 dtype 参数来定义数组中元素的数据类型。

例如:

import numpy as np

# 创建一个 int32 类型的数组
arr_int = np.array([1, 2, 3], dtype=np.int32)
print(arr_int.dtype)  # 输出: int32

# 创建一个 float64 类型的数组
arr_float = np.array([1, 2, 3], dtype=np.float64)
print(arr_float.dtype)  # 输出: float64
arr_str = np.array([1,2,3],dtype=np.string_)
print(arr_str)
#输出:
AttributeError: `np.string_` was removed in the NumPy 2.0 release. Use `np.bytes_` instead.
    
arr_str = np.array([1,2,3],dtype=np.bytes_)
print(arr_str)
#输出:
[b'1' b'2' b'3']

arr_str = np.array([1,2,3],dtype=np.unicode_)
print(arr_str)
# 输出:
AttributeError: `np.unicode_` was removed in the NumPy 2.0 release. Use `np.str_` instead.

arr_str = np.array([1,2,3],dtype=np.str_)
print(arr_str)
# 输出:
['1' '2' '3']

2.可以使用数组的 dtype 属性来获取数组中元素的数据类型。

例如:

arr = np.array([1, 2, 3])
print(arr.dtype)  # 输出: int32

3.可以使用 astype() 方法来转换数组中元素的数据类型。

例如:

arr = np.array([1, 2, 3])
arr_float = arr.astype(np.float64)
print(arr_float.dtype)  # 输出: float64

3.2 数据类型标识码

NumPy 中每种数据类型都有一个唯一标识的字符码,int8, int16, int32, int64 四种数据类型可以使用字符串 ‘i1’, ‘i2’,‘i4’,‘i8’ 代替,如下所示:

字符 对应类型
b 代表布尔型
i 带符号整型
u 无符号整型
f 浮点型
c 复数浮点型
m 时间间隔(timedelta)
M datatime(日期时间)
O Python对象
S,a 字节串(S)与字符串(a)
U Unicode
V 原始数据(void)

以下是 NumPy 中常见的数据类型标识码及其对应的详细列表:

整数类型

数据类型 标识码 描述
int8 i1 8 位有符号整数
int16 i2 16 位有符号整数
int32 i4 32 位有符号整数
int64 i8 64 位有符号整数
uint8 u1 8 位无符号整数
uint16 u2 16 位无符号整数
uint32 u4 32 位无符号整数
uint64 u8 64 位无符号整数

浮点数类型

数据类型 标识码 描述
float16 f2 16 位浮点数(半精度)
float32 f4 32 位浮点数(单精度)
float64 f8 64 位浮点数(双精度)

复数类型

数据类型 标识码 描述
complex64 c8 64 位复数(单精度)
complex128 c16 128 位复数(双精度)

布尔类型

数据类型 标识码 描述
bool b1 布尔类型

字符串类型

数据类型 标识码 描述
bytes S10 长度为 10 的字节串
str U10 长度为 10 的 Unicode 字符串

Python 对象类型

数据类型 标识码 描述
O O Python 对象类型

例如:自定义一个int32的数据类型

dt=np.dtype('i4')
data = np.array([1,2,3,4],dtype=dt)
print(data)   #输出:[1 2 3 4]
print(data.dtype)	#输出:int32

可以自定义复杂的数据结构:

dt=np.dtype([('name','S10'),('age','i4')])
data = np.array([('zhangsan',20),('lisi',21)],dtype=dt)
print(data)			#输出:[(b'zhangsan', 20) (b'lisi', 21)]
print(data.dtype)	#输出:[('name', 'S10'), ('age', '<i4')]

说明:

在编程中,字节序标记用于指定数据的字节顺序。常见的字节序标记包括:

  • <: 小端序,数据的最低有效字节存储在内存的最低地址,而最高有效字节存储在内存的最高地址。
  • >: 大端序,数据的最高有效字节存储在内存的最低地址,而最低有效字节存储在内存的最高地址。

4.数组属性

4.1 shape

返回一个元组,元组中的每个元素表示数组在对应维度上的大小。元组的长度等于数组的维度数。

shape 属性功能:
返回一个由数组维度构成的元组
shape=(行数,列数)
返回一个形状的元组
可以修改数组的形状
修改过后的必须与原数组的个数保持一致

array_one = np.array([[1,2,3],[4,5,6]])
array_one.shape = (3,2)
print('array_one 转变数组维度大小之后的数组维度:',array_one.shape)
print('array_one 转变数组维度大小之后的数组内容:',array_one)

如果使用shape属性修改数组的形状,则修改的是原数组的形状,reshape修改数组的形状会返回一个新数组,不修改原数组的形状。

4.2 数组维度

数组的维度就是一个数组中的某个元素,当用数组下标表示的时候,需要用几个数字来表示才能唯一确定这个元素,这个数组就是几维

ndmin 是 NumPy 中用于创建数组时指定最小维度的参数。它通常在 numpy.array() 函数中使用。通过 ndmin,你可以确保生成的数组至少具有指定的维度。

ndim 是 NumPy 数组的一个属性,用于返回数组的维度数(即数组的秩)。它表示数组有多少个维度。

案例:

import numpy as np

# 指定/查看数组维度
def ndmin_test():
    threeArray = np.array([1,2,3,4],ndmin=2)
    print("ndmin 指定数组:",threeArray)
    print("ndmin 指定数组:",type(threeArray))
    print("ndim 查看维度:",threeArray.ndim)

4.3 flags

flags 属性功能:

  1. 返回 ndarray 数组的内存信息
'''
    flags 属性功能:
        1、返回 ndarray 数组的内存信息
'''
def flags_test():
    array_one = np.array([[1,2,3],[4,5,6]])
    print('array_one 数数组的内存信息:\n',array_one.flags)

输出:

C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False

5.切片

ndarray 对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样;
切片:[start:stop:step],stop是不包含的
numpy数组切片,可以分行方向切片,列方向切片

5.1 slice()

在 Python 中,slice 可以作为一个对象来使用。你可以创建一个 slice 对象,然后使用它来获取序列的片段。

参数:

  • start 是切片开始的位置(包含该位置)。
  • stop 是切片结束
<think>嗯,用户现在想了解Anaconda和第三方库的关系逻辑。之前他们遇到了安装第三方库但无法使用的问题,现在可能想更深入理解环境管理,避免类似问题。Anaconda本身是一个Python发行版,集成了很多科学计算的库,但用户可能不清楚它是如何管理这些库和环境的。 首先,我需要解释Anaconda的核心功能,比如包管理和环境隔离。用户可能对conda和pip的区别不太清楚,特别是为什么有时候用conda安装,有时候用pip。需要明确conda不仅管理Python包,还处理非Python的依赖,而pip仅限于Python包。 另外,用户之前碰到环境问题,所以Anaconda的环境管理功能对他们应该很有帮助。需要说明如何创建独立环境,安装不同版本的库,避免冲突。可能还要提到渠道(channels)的概念,比如默认的channel和conda-forge,以及为什么有时需要切换渠道。 用户可能对虚拟环境和系统环境的关系有疑问,需要区分conda环境与venv的不同。还要注意,如果在conda环境中混用pip和conda安装,可能会导致依赖冲突,这时候需要指导正确的使用顺序,比如先用conda安装,再用pip。 最后,总结Anaconda如何简化第三方库的管理,解决版本冲突和环境隔离的问题,帮助用户高效管理项目依赖。可能还要提醒常见问题,比如安装库时选择正确的渠道,环境未激活导致库找不到等,这些都与之前的安装问题相关。</think>好的!我来通俗易懂地解释 **Anaconda** 与第三方库的关系逻辑,以及它们如何协同工作。 --- ### **1. Anaconda的本质** **Anaconda** 是一个 **Python/R 的科学计算发行版**,它集成了: 1. **Python 解释器**:运行代码的核心。 2. **Conda 包管理器**:管理第三方库和环境的工具。 3. **预装科学计算库**:如 NumPy、Pandas、Matplotlib 等(约 250+ 个)。 4. **虚拟环境管理**:允许创建多个独立环境,避免库版本冲突。 简单来说,Anaconda = **Python + 常用库 + 环境管理工具**。 --- ### **2. Anaconda如何管理第三方库?** #### **(1) Conda 的核心作用** - **安装库**:通过 `conda install 库名` 命令安装库。 - **解决依赖**:自动处理库的依赖关系(例如安装库 A 时会自动安装其依赖的库 B 和 C)。 - **管理版本**:可以指定库的版本(如 `conda install numpy=1.21`)。 - **跨平台支持**:Conda 库会针对不同操作系统(Windows/macOS/Linux)提供适配的版本。 #### **(2) Conda vs Pip** | 特性 | Conda | Pip(Python自带) | |---------------------|-------------------------------|--------------------------------| | **管理范围** | Python库 + **非Python库**(如C/C++依赖) | 仅Python库 | | **依赖解决** | 强依赖解决(更严格) | 弱依赖解决(可能冲突) | | **环境隔离** | 内置环境管理 | 需配合 `venv` 等工具 | | **预编译二进制包** | 提供优化后的二进制包(安装快) | 可能需要本地编译(耗时) | --- ### **3. 第三方库的来源:Conda渠道(Channels)** - **官方渠道(default)**:Anaconda 官方维护的库(稳定,但更新较慢)。 - **Conda-forge**:社区维护的渠道,库更新更快、更全(推荐优先使用)。 - **自定义渠道**:可添加第三方渠道(如 `bioconda` 用于生物信息学库)。 #### **安装库时指定渠道** ```bash conda install -c conda-forge 库名 # 从conda-forge渠道安装 ``` --- ### **4. 环境隔离:Anaconda的核心优势** #### **(1) 为什么需要环境隔离?** - 不同项目可能依赖同一库的 **不同版本**(如项目A需要 TensorFlow 1.x,项目B需要 TensorFlow 2.x)。 - 直接全局安装会导致版本冲突。 #### **(2) 如何操作?** 1. **创建新环境**: ```bash conda create -n 环境名 python=3.9 # 指定Python版本 ``` 2. **激活环境**: ```bash conda activate 环境名 # Windows/macOS/Linux通用 ``` 3. **在环境中安装库**: ```bash conda install numpy pandas # 仅在当前环境中安装 ``` 4. **退出环境**: ```bash conda deactivate ``` --- ### **5. Anaconda与第三方库的关系逻辑总结** 1. **层级结构**: ``` Anaconda ├── Base(根环境) ├── 环境1(含库A版本1) └── 环境2(含库A版本2) ``` 2. **库的归属**: - 每个环境独立存储库(安装在 `envs/环境名` 目录下)。 - 不同环境的库互不影响。 3. **优先级规则**: - 激活某个环境后,所有操作(安装、运行库)仅针对该环境。 --- ### **6. 常见问题** #### **(1) 用Conda还是Pip安装库?** - **优先用Conda**:尤其是涉及复杂依赖的科学计算库(如NumPy、TensorFlow)。 - **Pip作为补充**:如果Conda渠道没有某个库(如小众库),再用 `pip install`。 #### **(2) 混用Conda和Pip的风险** - 在同一个环境中,混用Conda和Pip可能导致依赖冲突。 - **建议顺序**: 1. 先用Conda安装尽可能多的库。 2. 再用Pip安装剩余库。 #### **(3) 库安装失败?** - 检查渠道是否有该库:`conda search 库名`。 - 尝试切换渠道:`conda install -c conda-forge 库名`。 --- ### **总结** Anaconda 通过 **Conda包管理器** 和 **环境隔离机制**,解决了第三方库的版本冲突、依赖复杂等问题。你可以像“搭积木”一样,为每个项目创建独立的环境,灵活安装不同版本的库,从而保证项目之间的纯净性和可复现性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值