Numpy

Numpy


〇、介绍

NumPy(Numerical Python,数值python)是Python数据分析必不可少的第三方库NumPy本身是由C语言开发,摆脱了python语言的GIL(Global Interpreter Lock,全局解释器锁)。

GIL是Python解释器(尤其是CPython实现)中的一个机制,用于同步线程的执行,确保同一时刻只有一个线程可以执行Python字节码。防止多线程并发执行时出现资源竞争问题。即使在多核CPU上,Python的多线程程序也无法实现真正的并行执行(因为GIL会强制串行化线程)。

所以为了规避GIL,将计算密集型代码用C/C++编写(通过ctypesCython调用),释放GIL。

NumPy重在数值计算,主要用于多维数组(矩阵)处理的库。Python中的array,虽然也是能存储相同类型的数据,存放在连续空间内,但是只能存储一维数据

NumPy用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多(python自身的列表可以存储多种数据类型,数据分散存放,但是它是以两次索引为代价列表中存储的是数据地址,再次索引才能找到数据。时间换连续空间)。

一、ndarray

numpy使用ndarray对象处理多维数组。ndarray中元素类型相同,内存空间连续。

# 导入numpy模块
import numpy as np

# 创建ndarray数组
score = np.array(
    [1,2,3,4]   # 一维数组
)

ndarray属性

属性名字 属性解释
ndarray.shape 数组维度的元组
ndarray.ndim 数组维数(也称秩)
ndarray.size 对象中的全部元素数量
ndarray.itemsize 一个数组元素的长度(字节)
ndarray.nbytes 对象中所有元素占的长度(字节)
ndarray.dtype 数组元素的类型
ndarray.T 转置该对象,相当于numpy.transpose(ndarray)

ndarray类型

名称 描述 简写
np.bool 用一个字节存储的布尔类型(True或False) 'b'
np.int8 一个字节大小,-128 至 127 'i'
np.int16 整数,-32768 至 32767 'i2'
np.int32 整数,-2^31 至 2^32 -1 'i4'
np.int64
(整数默认)
整数,-2^63 至 2^63 - 1 'i8'
np.uint8 无符号整数,0 至 255 'u'
np.uint16 无符号整数,0 至 65535 'u2'
np.uint32 无符号整数,0 至 2^32 - 1 'u4'
np.uint64 无符号整数,0 至 2^64 - 1 'u8'
np.float16 半精度浮点数:16位,正负号1位,指数5位,精度10位 'f2'
np.float32 单精度浮点数:32位,正负号1位,指数8位,精度23位 'f4'
np.float64
浮点数默认
双精度浮点数:64位,正负号1位,指数11位,精度52位 'f8'
np.complex64 复数,分别用两个32位浮点数表示实部和虚部 'c8'
np.complex128 复数,分别用两个64位浮点数表示实部和虚部 'c16'
np.object_ python对象 'O'
np.string_ 字符串 'S'
np.unicode_ unicode类型 'U'

二、ndarray基本操作

生成数组的方法 np.函数()

访问ndarray数组内元素

# 现有ndarray数组a,二维数组,形状(2,4),访问二行三列元素
a[1,2]

1、生成0,1, 空数组

① zeros()
np.zeros(shape, dtype=float, order='C', *, like=None)
"""
    shape(必填):int或tuple,数组的形状(如 5 或 (2,3))
    dtype:元素数据类型,默认是float64
    👆(重要)👆
    order:{'C', 'F'},'C'内存布局。C风格(行优先)或 Fortran风格(列优先)
    like:array-like	None参考对象(用于兼容其他数组库,如CuPy)
"""
# 生成0数组
np.zeros(shape=(3,4),dtype="float32") #元组指定ndarray数组形状
np.zeros(shape=[3,4],dtype="float32") #列表指定ndarray数组形状
numpy.zeros_like(a, dtype=None, order='K', subok=True, shape=None)
"""
    a,          # (必填) 输入数组,新数组将继承其形状和数据类型
	dtype=None, # (可选) 覆盖原数组的数据类型。如设为int,则返回整数零数组
	👆(重要)👆
    
    order='K',  # (可选) 内存布局:'C'-行优先,'F'-列优先,'A'-保留输入布局,'K'-匹配输入布局(默认)
    subok=True, # (可选) 若True保留输入数组的子类类型(如matrix),False强制转为ndarray
    shape=None  # (可选) NumPy 1.20+新增,可覆盖输入数组的形状
"""
②ones()
numpy.ones(shape, dtype=None, order='C', *, like=None)
"""
	shape,          # (必填) int或tuple,定义数组形状。如:3 → [1,1,1], (2,3) → [[1,1,1],[1,1,1]]
	dtype=None,     # (可选) 数据类型,默认float64。支持:'float32', 'int8', 'bool'等
	👆(重要)👆
	
	order='C',      # (可选) 内存布局:'C'-行优先(默认),'F'-列优先
	*,              # 分隔符
	like=None       # (可选) 兼容其他数组库(如CuPy/TensorFlow)
"""
# 生成1数组
np.ones(shape=(3,4),dtype="float32")
np.ones_like(a, dtype="")
numpy.ones_like(a, dtype=None, order='K', subok=True, shape=None)
"""
	a,              # (必填) 参考数组,新数组继承其形状和dtype
	dtype=None,     # (可选) 覆盖原数据类型。如原为int可改为'float64'
	👆(重要)👆
	
	order='K',      # (可选) 内存布局:'C'/行优先,'F'/列优先,'K'/匹配输入(默认),'A'/保留输入
	subok=True,     # (可选) True保留子类类型(如matrix),False强制转为ndarray
	shape=None      # (可选) NumPy 1.20+支持,覆盖原形状
"""
③empty()

创建一个内容随机并且依赖于内存状态的数组

numpy.empty(shape, dtype=float, order='C', *, like=None)
"""
	shape,          # (必填) int或tuple,定义数组形状。如:3 → 含3个未初始化值的一维数组
	dtype=float,    # (可选) 数据类型,默认float64。支持:'int8', 'float32', 'bool'等
	👆(重要)👆
	
	order='C',      # (可选) 内存布局:'C'-行优先(默认),'F'-列优先
	*,              # 分隔符
	like=None       # (可选) 兼容其他数组库(需实现__array_function__协议)
"""
④ndarray.fill()

直接修改原数组,而不是创建一个新的数组。

ndarray.fill(value)
"""
	value:(标量值): 要填充到数组中的值。这个值可以是:
			Python 标量(如整数、浮点数、布尔值等)
			会自动转换为数组的 dtype(数据类型)
			如果值无法转换为数组的数据类型,会引发 TypeError

"""
import numpy as np
array1 = np.empty((3,4),float)
array1.fill(10)  # array([[10., 10., 10., 10.],
       			 #		  [10., 10., 10., 10.],
       			 #		  [10., 10., 10., 10.]])
⑤numpy.full()
np.full(shape, fill_value, dtype=None)
"""
    shape: 数组的形状(整数或整数元组)
    fill_value: 填充数组的值(标量)
    dtype: 数组数据类型(可选)
        
    返回值: 填充指定值的NumPy数组
----------------
1. 比先创建empty再fill()快约15%
2. 对大型数组,明确指定dtype可节省内存
3. 需要填充不同值时,考虑使用:
   np.where(condition, x, y)  # 条件填充
   np.random.uniform(low, high, size)  # 随机填充
"""

2、现有数组生成

①np.array()

深拷贝

numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0)
"""
	object,         # (必填) 输入数据(列表/元组/数组等)
	dtype=None,     # (可选) 强制指定数据类型
	👆(重要)👆
	
	copy=True,      # (必填) 默认True执行深拷贝
	order='K',      # (可选) 内存布局:'C'/'F'/'A'/'K'(默认)
	subok=False,    # (可选) 是否保留子类类型
	ndmin=0         # (可选) 指定最小维度数
"""
②copy()

深拷贝

两种用法

numpy.copy()

ndarray.copy()

numpy.copy(a, order='K')
"""
	a,              # (必填) 输入数组
	👆(重要)👆
	
	order='K',      # (可选) 内存布局:'C'/'F'/'A'/'K'(默认)
"""
ndarray.copy()
"""
	一般会用在更改数据但是却共享内存的情况下,之后会用一下copy()方法
	如:
	b = a.transpose(2,0,1).copy()
"""
③np.asarray(a)

浅拷贝

浅拷贝是数据值都是一样的,但是可以改变数据类型。

numpy.asarray(a, dtype=None, order=None)
"""
	a,              # (必填) 输入数据
	dtype=None,     # (可选) 数据类型转换
	👆(重要)👆
	
	order=None      # (可选) 内存布局控制
"""

x=np.array([1,2,3,4],dtype=np.int32)  # array([1, 2, 3, 4])
y=np.asarray(x, dtype=np.float64)  # array([1., 2., 3., 4.])


3、生成固定范围数组

① linspace()

规定个数的等差数组

# 创建指定个数的等差数组
np.linspace(start, stop, num, endpoint)
"""
	start: 起始值
	stop: 终止值
	num: 生成等间隔样例数量(总共生成多少数据)
	endpoint: 是否包含终点,默认True
	eg:
		np.linspace(0, 100, 3) -> [0, 50, 100]
		np.linspace(0, 100, 4) -> [0, 33.33334, 66.66667, 100]	
"""
② arange()

规定步长的等差数组

# 创建指定步长的数组
np.arange(start, stop, step, dtype)
"""
	step: 指定步长,不传入指定为1
	stop: 终止值,默认不包含
"""
③ logspace()

等比数组

# 创建等比数列指定数量的数组
np.logspace(start, stop, num, base=10)
np.logspace(0,2,3) # [1., 10., 100.]
"""
	start:起始点,10^start
	stop: 终点,10^stop
	num: 数组元素总数
	base:默认是10,创建数据的基数
"""

4、生成随机数组

使用np.random模块

Ⅰ、正态分布
① normal()
np.random.normal(loc=0.0, scale=1.0, size=None)
"""
    loc:float,概率分布的**均值**,图的中心
    scale:float,概率分布的**标准差**,越大越胖矮,越小越瘦高
    size:输出的形状(tuple),默认为None,只输出一个值。生成一维数组就传入一个值,该值代表传入元素总数
"""
② randn()
python np.random.randn(d0,d1,...,dn)
"""
	d0,d1,...,dn:生成的数组形状
	功能:从标准正态分布中返回一个或多个样本值,与normal**区别**是randn**指定均值为0,标准差为1**。
"""
  • 例子:np.random.randn(2, 3)生成2行3列标准正态分布数组
③ standard_normal
np.random.standard_normal(size=None)
"""
    np.random.standard_normal()  		生成(单个)标准正态分布数字
    np.random.standard_normal(8)		生成(一维)标准正态分布数组
    np.random.standard_normal((2,3))	生成(二维)标准正态分布数组
"""

Ⅱ、均匀分布
① uniform()
np.random.uniform(low=0.0, high=1.0, size=None)  # 从[low, high)中随机抽样
"""
    low:采样下界,float类型,默认为0
    high:采样上届,float类型,默认为1
    size:样本总数,或者为元组,元组描述数组的形状,默认值为1
    返回值:ndarray类型
"""
② randn()
np.random.rand(d0,d1,...,dn)
"""
    d0,d1,...,dn:生成数组的形状,一维就是数量
    返回值:生成[0.0,1.0)内的均匀分布的数
"""
③ randint()
np.random.randint(low,high=None,size=None,dtype='I')
"""
	high有值时,从[low,high)之间取整数,否则从[0,low)之间取整数
	size: 无值传入,默认生成一个数
"""

5、matrix()生成二维数组

matrix 是 ndarray 的子类,只能生成 2 维的矩阵

numpy.matrix(data, dtype=None, copy=True)
"""
	data,          # (必填) 输入数据,可以是数组、列表、字符串等
	dtype=None,    # (可选) 输出矩阵的数据类型
	
	copy=True      # (必填) 是否创建数据副本(默认True)
"""
x1=np.mat("1 2;3 4")
print( x1)
x2=np.matrix("1,2;3,4")
print( x2)
x3=np.matrix([[1,2,3,4],[5,6,7,8]])
print( x3)

数组的索引&切片

①[ : , : ]的形式。

具体形式 [star:stop:step, star:stop:step],同一维度切片由 star:stop:step组成,不同维度之间用逗号隔开

二维数组的索引&切片

# 二维数组array2
array2[0,0:3]

# 三维数组array3
array3[0,0,1]

②bool索引

索引也可以是bool类型的ndarray数组,不过要求索引数组与原数组形状相同。

x=np.array(    [1,   2,   3,   4,    5])
index=np.array([True,True,True,False,False],dtype="bool")
x[index] # array([1, 2, 3])

形状修改


①reshape()

两种用法

numpy.reshape(a, newshape, order='C')

ndarray.reshape(newshape, order='C')

不会改变原数组,而是生成新数组

numpy.reshape(a, newshape, order='C')  # numpy中的函数
#或者
ndarray.reshape(newshape, order='C')  # ndarray中的方法
"""
	a:要变形的数组(可以是列表或NumPy数组)
	newshape:新形状,比如(2,3)变2行3列,-1表示自动计算,除不尽会报错。
	
	order:'C'按行排(默认),'F'按列排

返回值:
返回新形状的数组(通常是原数组的视图,不复制数据)

例子:
>>> np.arange(6).reshape(2,3)
[[0 1 2]
 [3 4 5]]
"""

②resize()

两种用法

numpy.resize(a, new_shape)

ndarray.resize(new_shape, refcheck=True)

numpy.resize(a, new_shape)  # numpy中的函数
"""
改变数组大小(可增减元素总数)

参数说明:
a:要调整的数组(列表/NumPy数组均可)
new_shape:整数或元组,指定新形状(如(3,4))

返回值:
返回新数组(总是创建副本)

特点:
1. 新形状更大 → 循环填充原数据
2. 新形状更小 → 截取前部数据
3. 总元素数可变

示例:
>>> np.resize([1,2], (3,3))
[[1 2 1]
 [2 1 2]
 [1 2 1]]
"""

ndarray.resize(new_shape, refcheck=True)  # ndarray中的方法
"""
原地修改数组形状(必须保持元素总数)

参数说明:
new_shape:整数或元组,新形状
refcheck:是否检查内存引用(默认True)

特点:
1. 直接修改当前数组
2. 总元素数不可变
3. 性能优于np.resize()

示例:
>>> a = np.array([1,2,3,4])
>>> a.resize((2,2))  # 直接修改a
>>> a
[[1 2]
 [3 4]]
"""

③ndarray.T

不会改变原数组形状,而是创建一个新的改变了形状的视图,这个视图与原来的数组共享内存。所以一般会使用 ndarray.copy()创建新的独立的数组对象。

ndarray.T
"""
	不会改变原数组形状,返回一个更改形状的新数组
"""
# 1. 基本用法
a = np.zeros((2,3))
b=a.T.copy() # a.shape (2,3)
	  		 # b.shape (3,2)


# 2. 高维数组的转置
#对于高维数组,.T 会默认反转所有维度顺序。例如,形状为 (d0, d1, d2) 的数组转置后变为 (d2, d1, d0)。

arr_3d = np.arange(6).reshape(3, 2, 1)
print("原数组形状:", arr_3d.shape)  # (3, 2, 1)
print("转置后形状:", arr_3d.T.shape)  # (1, 2, 3)

④transpose()

不会改变原数组形状,而是创建一个新的改变了形状的视图,这个视图与原来的数组共享内存。所以一般会使用 ndarray.copy()创建新的独立的数组对象。

两种用法

numpy.transpose()

ndarray.transpose()

numpy.transpose(a, axes=None)
"""
	a:要转置的输入数组
	axes:整数列表或元组(可选),指定新的轴顺序
	
	
example:
	a = np.zeros((224,224,3))
	b = np.transpose(a,(2,0,1).copy()
		a → (224,224,3)
		b → (3,224,224)
	
"""
ndarray.transpose(*axes)
"""
	*axes:可变参数,指定新的轴排列顺序
        - 不传参数:完全反转维度顺序(等价于.T)
        - 传入整数序列:自定义每个维度的新位置
        
example:
	a = np.zeros((2,3,4))
	b = a.transpose().copy()
	c = a.transpose(2,0,1)
		a → (2,3,4)
		b → (4,3,2)
		c → (4,2,3)
"""

⑤np.astype()

ndarray.astype(dtype)
"""
    dtype: 目标数据类型(支持字符串格式如 'float32' 或 numpy.dtype 对象如 np.int64)
   
    返回值: 返回转换类型后的新数组(默认创建一个新的数组返回)
"""

类型修改 astype()

ndarray.astype(type)
"""
	返回类型修改之后的新数组
"""

ndarray.tostring()
ndarray.tobytes()
"""
	jupyter输出太大可能崩溃
"""

三、numpy内置函数

1.基本函数


1. np.ceil()

向上取整

np.ceil(x, dtype=None)
"""
    x:输入数组或标量(支持 int, float, array_like)
    dtype(可选):指定输出数据类型(如 np.float32)
 
    返回值:计算输入值的向上取整(返回 ≥ 输入的最小整数),返回与x形状相同的数组或标量,
    		类型为整数或浮点数(尽量与x类型一致)。
"""

2.np.floor()

向下取整

np.floor(x, dtype=None)
"""
    x: 输入数组或标量(支持 int, float, array_like)
    dtype(可选): 指定输出数据类型(如 np.float32)

    返回值: 计算输入值的向下取整(返回 ≤ 输入的最大整数),返回与x形状相同的数组或标量,
            类型为整数或浮点数(尽量与x类型一致)。
"""

3.np.rint()

四舍五入

np.rint(x, dtype=None)
"""
    x: 输入数组或标量(支持 int, float, array_like)
    dtype(可选): 指定输出数据类型(如 np.float32)

    返回值: 计算输入值的四舍五入(.5时向偶数取整),返回与x形状相同的数组或标量,
            类型为整数或浮点数(尽量与x类型一致)。
"""

4.np.isnan()

np.isnan(x, dtype=None)
"""
    x: 输入数组或标量(支持 int, float, array_like)
    dtype(可选): 指定输出数据类型(如 np.bool_)

    返回值: 检测输入值是否为NaN(Not a Number),返回与x形状相同的布尔数组,
            True表示对应位置是NaN。
"""

5.np.multiply()

*逐元素乘积,等价于

array1 * array2 ↔ np.multiply(array1, array2)

np.multiply(x1, x2, dtype=None) # 哈达玛积
"""
    x1, x2: 输入数组或标量(支持广播)
    dtype(可选): 指定输出数据类型(如 np.float32)

    返回值: 计算x1和x2的逐元素乘积,返回与广播后形状相同的数组,
            类型由输入类型提升决定。
"""

6.np.divide()

逐元素相除,等价于 /。

array1 / array2 ↔ np.divide(array1, array2)

np.divide(x1, x2, dtype=None)
"""
    x1, x2: 输入数组或标量(支持广播)
    dtype(可选): 指定输出数据类型(如 np.float32)

    返回值: 计算x1和x2的逐元素商,返回与广播后形状相同的浮点型数组,
            即使输入为整数也返回浮点数。
"""

7.np.abs()

输入值的绝对值

np.abs(x, dtype=None)
"""
    x: 输入数组或标量(支持 int, float, array_like)
    dtype(可选): 指定输出数据类型(如 np.float32)

    返回值: 计算输入值的绝对值,返回与x形状相同的非负数组,
            类型尽量与x类型一致(复数输入返回浮点数)。
"""

8.np.where()

np.where(condition, x=None, y=None)
"""
    condition: 布尔数组或条件表达式
    x, y(可选): 与condition广播兼容的数组或标量

    返回值: 
        若提供x和y: 返回根据condition从x或y中选择的值组成的数组
        若未提供x和y: 返回满足condition的元素的索引元组(如(row_idx, col_idx))
"""

np.where(condition)
"""
	condition表示条件
	返回ndarray数组,表示数组元素值满足condition的索引。如果condition中的数组是一维,返回一个ndarray数组,二维返回两个ndarray数组(一个表示行索引,一个表示列索引...以此类推)
"""

2.统计函数

统计函数在不给定维度参数的时候,默认会展平高维数组,然后进行统计计算。

np.mean()/np.median()

np.mean(a, axis=None, dtype=None, keepdims=False)
"""
    a: 输入数组或可转换为数组的对象
    axis: 
        None - 计算所有元素的平均值(默认)
        0 - 按列计算
        1 - 按行计算
    dtype: 计算时使用的数据类型(如np.float64)
    keepdims: 
        True - 保持原数组维度
        False - 降维(默认)
        
    返回值: 计算后的平均值(中位数)数组或标量
"""

np.sum()

np.sum(a, axis=None, dtype=None, keepdims=False)
"""
    a: 输入数组或可转换为数组的对象
    axis: 
        None - 计算所有元素的和(默认)
        0 - 按列求和
        1 - 按行求和
    dtype: 计算时使用的数据类型(如np.int32)
    keepdims: 是否保持维度(默认False)
        
    返回值: 计算后的和数组或标量
"""

np.max()/np.min()

np.max(a, axis=None, keepdims=False)
"""
    a: 输入数组或可转换为数组的对象
    axis: 
        None - 查找所有元素的最值(默认)
        0 - 按列查找
        1 - 按行查找
    keepdims: 是否保持维度(默认False)
        
    返回值: 最大值/最小值数组或标量
"""

np.std()/np.var()

np.std(a, axis=None, dtype=None, ddof=0, keepdims=False)
"""
    a: 输入数组
    axis: 计算轴(None/0/1)
    dtype: 计算数据类型
    ddof: 
        0 - 总体标准差/方差(默认)
        1 - 样本标准差/方差
    keepdims: 是否保持维度
        
    返回值: 标准差/方差数组或标量
"""

np.argmax()/np.argmin()

np.argmax(a, axis=None)
"""
    a: 输入数组
    axis: 
        None - 展平数组后查找(默认)
        0 - 按列查找
        1 - 按行查找
        
    返回值: 最大/最小值索引的数组或标量
"""

np.cumsum()/np.cumprod()

np.cumsum(a, axis=None, dtype=None)
"""
    a: 输入数组
    axis: 
        None - 展平数组后计算(默认)
        0 - 按列计算
        1 - 按行计算
    dtype: 计算结果数据类型
        
    返回值: 累加/累乘结果数组。指定维度计算时,返回值与a形状相同。不指定维度返回一维数(展平后计算)。
    
    example:
    arr = np.array([1, 2, 3, 4])
    np.cumsum(arr)  # 输出: [1, 2, 6, 10]
    
    
    arr2 = np.array([[1, 2], 
    			 	 [3, 4]])
    np.cumsum(arr_2d, axis=0)  # [[1,2]
								  [4,6]]
	np.cumsum(arr_2d, axis=1)  # [[1,3]
								  [3,7]]						   
"""

3.比较函数

np.any()/np.all()

x=np.random.randint(0,10,(2,2))
#array([[1, 9],
#       [9, 9]])

np.any(x > 5)  # True
np.all(x < 10)  # True

4.去重函数

np.unique()

找到唯一值并返回排序结果,类似于Python的set集合。

np.unique(x, return_index=False, return_inverse=False, return_counts=False, axis=None)
"""
    x: 输入数组或可转换为数组的对象
    return_index: 
        True - 返回唯一值在原数组中的首次出现位置索引
        False - 不返回(默认)
    return_inverse: 
        True - 返回重建原数组所需的索引数组
        False - 不返回(默认)
    return_counts: 
        True - 返回每个唯一值的出现次数
        False - 不返回(默认)
    axis: 
        None - 将数组展平后处理(默认)
        0 - 按行处理(对二维数组)
        1 - 按列处理(对二维数组)
        
    返回值: 
        默认返回唯一值数组
        当指定return_*参数时,返回包含额外结果的元组
"""
# example:
arr = np.array([3, 1, 2, 2, 3, 1, 4])
np.unique(arr) # [1,2,3,4]	

arr2 = np.array([[1, 2], [3, 1], [1, 2]])
np.unique(arr) # 展开再计算 [1,2,3]	
np.unique(arr_2d, axis=0) # [[1 2],[3 1]]
np.unique(arr_2d, axis=1) # [[1, 2], [3, 1], [1, 2]]

5.排序函数 sort()

两种用法

①np.sort()

np.sort(a, axis=-1, kind=None, order=None)
"""
    a: 输入数组或可转换为数组的对象
    axis: 
        -1 - 沿最后一个轴排序(默认)
        None - 展平数组后排序
        0 - 按列排序
        1 - 按行排序
    kind: 排序算法
        'quicksort' - 快速排序(默认)
        'mergesort' - 归并排序(稳定)
        'heapsort' - 堆排序
        'stable' - 稳定排序
    order: 
        用于结构化数组的排序字段(字符串或字符串列表)
        
    返回值: 排序后的数组(总是返回副本)
"""

②ndarray.sort()

ndarray.sort(axis=-1, kind=None, order=None)
"""
    axis: 
        -1 - 沿最后一个轴排序(默认)
        None - 展平数组后排序
        0 - 按列排序
        1 - 按行排序
    kind: 排序算法
        'quicksort' - 快速排序(默认)
        'mergesort' - 归并排序(稳定)
        'heapsort' - 堆排序
        'stable' - 稳定排序
    order: 
        用于结构化数组的排序字段(字符串或字符串列表)
        
    返回值: None (原地排序,直接修改原数组)
"""

四、ndarray运算

逻辑运算

# 现有n维数组array
array>90
"""
	返回一个和array一样形状的数组,元素值大于90时为True,否则为false
"""

array[array>90]=1
"""
	将array数组中大于90的元素赋值为1
"""
# 两个数组之间的逻辑运算
a = np.array([1, 2, 3])
b = np.array([2, 2, 2])

# 大于
print(a > b)   # [False False  True]

# 大于等于
print(a >= b)  # [False  True  True]

# 小于
print(a < b)   # [ True False False]

# 小于等于
print(a <= b)  # [ True  True False]

# 等于
print(a == b)  # [False  True False]

# 不等于
print(a != b)  # [ True False  True]

通用判断函数

# 现有一个数组score,10行5列,表示10个学生的5门成绩
np.all(score[:2,:] >= 60)
"""
	表示前两名同学[:2,:]是否成绩都及格了,满足返回True,否则返回False
	函数的返回值为True或False
"""

np.any(score[:2,:] < 60)
"""
	表示前两名同学成绩是否有不及格的,有返回True,否则返回False
	函数的返回值为True或False
"""

np.where三元运算符

temp = score[:2, :]
np.where(temp >= 60, 1, 0)
"""
	temp表示前两名同学的成绩
	返回一个和temp形状相同的新数组,不改变原数组,temp元素大于等于60时,数组元素为1,否则为0
"""

np.where(temp >= 60)
"""
	temp表示前两名同学的成绩
	返回ndarray数组,表示数组中大于60的索引。如果temp是一维,返回一个ndarray数组,二维返回两个ndarray数组(一个表示行索引,一个表示列索引...以此类推)
"""

如果在where中,判断条件有多个(即大于10,又小于100)

np.logical_and(condition1, condition2) ↔ condition1 & condition2

np.local.or(condition1, condition2) ↔ condition1 | condition2

这两个函数仅支持二条件组合,多条件可以嵌套函数实现。

np.logical_and(temp > 60, temp < 90)
"""
	返回一个与temp相同的形状数组,temp元素大于60且小于90时。新数组内元素为True,否则为False
	和where混合使用
	np.where(np.logical_and(temp>60, temp<90),1,0)
"""

np.local.or(temp < 60, temp > 90)
"""
	返回一个与temp相同的形状数组,temp元素小于60或者大于90时。新数组内元素为True,否则为False
	和where混合使用
	np.where(np.logical_or(temp<60, temp>90),1,0)
"""

统计运算

# 传入的第一个参数是ndarray数组,第二个参数表示根据行还是列进行统计运算,axis=0表示列,axis=1表示行(不传入维度参数会展开高维数组再进行计算)
np.max(array,axis)
np.min(array,axis)
np.argmax(array,axis)	# 最大值下标
np.argmin(array,axis)	# 最小值下标
np.median(array,axis)	# 中值
np.mean(array,axis)		# 平均值
np.std(array,axis)		# 标准差
np.var(array,axis)		# 方差

五、数组间的运算

数组与数的运算

数组中每一个元素与该数进行运算

# array=[1,2,3]
array + 2
array - 2
array / 2
array * 2
"""
	数组与数的运算是其中每一个元素与该数进行运算,返回一个新的数组。
	ndarray数组之间可以这样运算,python列表不行
"""

数组与数组之间运算

数组之间运算要求两个数组形状完全相等,对应元素进行运算。

如果形状不相同,满足广播机制也可以进行运算

广播机制:

首先将两个数组形状从右向左对齐

对应维度之间满足任意一个要求就可以:

  1. 对应维度等长
  2. 对应维度其中一个维度为1

满足以上要求后发现有一个维度少也可以进行计算。如:(9,8,5,2)和(8,1,2)

举例说明:shape1 (2,3,4)

​ shape2 (1,3,1) 可以运算

​ shape1 (2, 1, 3)

​ shape2 (2, 2, 3) 可以运算

​ shape1 (2, 1, 3)

​ shape2 (3,) 可以运算

六、矩阵

存储矩阵的方法有两种


1.使用ndarray数组存储

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

ndarray存储的矩阵可以使用 @ 进行矩阵乘法


2.使用matrix存储矩阵

numpy.matrix(data, dtype=None, copy=True)
"""
	data,          # (必填) 输入数据,可以是数组、列表、字符串等
	dtype=None,    # (可选) 输出矩阵的数据类型
	
	copy=True      # (必填) 是否创建数据副本(默认True)
"""

array = np.mat([[1,2,3],[1,2,6]])

matrix存储的矩阵可以直接使用 * 进行运算

进行矩阵乘法的两个矩阵使用这两种存储也可以进行矩阵运算。


3.矩阵的乘法运算

np.matmul(ndarray1, ndarray2)
np.dot(ndarray1, ndarray2)

"""
	np.matmul() 仅支持矩阵之间的乘法,不支持数与矩阵乘法
	np.dot()	都支持
	这两种的输入数据类型可以是ndarray,也可以是matrix
"""

七、合并与分割

合并


np.hstack()

# 水平拼接,高纬度拼接类似指定dim=1
np.hstack((array1, array2, array3))
"""
	array维度多少都可以
	
	example:
    (3,)(3,)→ (6,)
    (3,2)(3,2)→(3,4)
    (3,2,4)(3,2,4)→(3,4,4)
    (2,3,4,5)(2,3,4,5)→(2,6,4,5)
"""

np.vstack()

# 垂直拼接,高纬度拼接类似指定dim=0
np.vstack((array1, array2, array3))
"""
	array维度多少都可以
	
	example:
    (3,)(3,)→ (2,3)
    (3,2)(3,2)→(6,2)
    (3,2,4)(3,2,4)→(6,2,4)
    (2,3,4,5)(2,3,4,5)→(4,3,4,5)
"""

np.concatnate()

# 指定拼接方式 axis=0垂直拼接 axis=1水平拼接 
np.concatnate((array1, array2, array3),axis=1)
"""
	array维度多少都可以
"""

分割

# ①指定个数分割
np.split(array,3) # 每三个元素分割为一个新的数组,数组内元素必须是分割数的倍数

# example:
arr = np.array([1, 2, 3, 4, 5, 6])
np.split(arr, 3)  # 分割为3份,每份2个元素
				  # [array([1, 2]), array([3, 4]), array([5, 6])]
    
arr_2d = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
np.split(arr_2d, 2)  # 沿axis=0(行)分割为2份
                     # [array([[1, 2], [3, 4]]), 
                     #  array([[5, 6], [7, 8]])]    
        

# ②指定下标分割        
np.split(array,[3,4,7]) # 根据下标分割

# example
arr = np.array([10, 20, 30, 40, 50, 60, 70])
np.split(arr, [3, 4, 7])  # 在下标3,4,7处分割 
                            # [array([10, 20, 30]),  # arr[:3]
                            #  array([40]),          # arr[3:4]
                            #  array([50, 60, 70]),  # arr[4:7]
                            #  array([], dtype=int64)]  # arr[7:](空数组)
posted @ 2025-05-02 21:17  ape_Xl  阅读(58)  评论(0)    收藏  举报