numpy数组用法
一、Numpy数组基本用法
1、Numpy
是Python
科学计算库,用于快速处理任意维度的数组。
2、NumPy
提供一个N维数组类型ndarray,它描述了相同类型的“items”的集合。
3、numpy.ndarray
支持向量化运算。
4、NumPy
使用c语言写的,底部解除了GIL
,其对数组的操作速度不在受python
解释器限制。
二、numpy中的数组:
Numpy
中的数组的使用跟Python
中的列表非常类似。他们之间的区别如下:
1、一个列表中可以存储多种数据类型。比如a = [1,'a']
是允许的,而数组只能存储同种数据类型。
2、数组可以是多维的,当多维数组中所有的数据都是数值类型的时候,相当于线性代数中的矩阵,是可以进行相互间的运算的。
三、创建数组(np.ndarray对象):
Numpy
经常和数组打交道,因此首先第一步是要学会创建数组。在Numpy
中的数组的数据类型叫做ndarray
。以下是两种创建的方式:
1、根据Python
中的列表生成:
import numpy as np
a1 = np.array([1,2,3,4])
print(a1)
print(type(a1))
2、使用np.arange
生成,np.arange
的用法类似于Python
中的range
:
import numpy as np
a2 = np.arange(2,21,2)
print(a2)
3、使用np.random
生成随机数的数组:
a1 = np.random.random(2,2) # 生成2行2列的随机数的数组
a2 = np.random.randint(0,10,size=(3,3)) # 元素是从0-10之间随机的3行3列的数组
4、使用函数生成特殊的数组:
import numpy as np
a1 = np.zeros((2,2)) #生成一个所有元素都是0的2行2列的数组
a2 = np.ones((3,2)) #生成一个所有元素都是1的3行2列的数组
a3 = np.full((2,2),8) #生成一个所有元素都是8的2行2列的数组
a4 = np.eye(3) #生成一个在斜方形上元素为1,其他元素都为0的3x3的矩阵
四、ndarray常用属性:
ndarray.dtype
:
因为数组中只能存储同一种数据类型,因此可以通过dtype
获取数组中的元素的数据类型。以下是ndarray.dtype
的常用的数据类型:
数据类型 | 描述 | 唯一标识符 |
---|---|---|
bool | 用一个字节存储的布尔类型(True或False) | 'b' |
int8 | 一个字节大小,-128 至 127 | 'i1' |
int16 | 整数,16 位整数(-32768 ~ 32767) | 'i2' |
int32 | 整数,32 位整数(-2147483648 ~ 2147483647) | 'i4' |
int64 | 整数,64 位整数(-9223372036854775808 ~ 9223372036854775807) | 'i8' |
uint8 | 无符号整数,0 至 255 | 'u1' |
uint16 | 无符号整数,0 至 65535 | 'u2' |
uint32 | 无符号整数,0 至 2 ** 32 - 1 | 'u4' |
uint64 | 无符号整数,0 至 2 ** 64 - 1 | 'u8' |
float16 | 半精度浮点数:16位,正负号1位,指数5位,精度10位 | 'f2' |
float32 | 单精度浮点数:32位,正负号1位,指数8位,精度23位 | 'f4' |
float64 | 双精度浮点数:64位,正负号1位,指数11位,精度52位 | 'f8' |
complex64 | 复数,分别用两个32位浮点数表示实部和虚部 | 'c8' |
complex128 | 复数,分别用两个64位浮点数表示实部和虚部 | 'c16' |
object_ | python对象 | 'O' |
string_ | 字符串 | 'S' |
unicode_ | unicode类型 | 'U' |
我们可以看到,Numpy
中关于数值的类型比Python
内置的多得多,这是因为Numpy
为了能高效处理处理海量数据而设计的。举个例子,比如现在想要存储上百亿的数字,并且这些数字都不超过254(一个字节内),我们就可以将dtype
设置为int8
,这样就比默认使用int64
更能节省内存空间了。类型相关的操作如下:
1、默认的数据类型:
import numpy as np
a1 = np.array([1,2,3])
print(a1.dtype)
# 如果是windows系统,默认是int32
# 如果是mac或者linux系统,则根据系统来
2、指定
dtype:
import numpy as np
a1 = np.array([1,2,3],dtype=np.int64)
# 或者 a1 = np.array([1,2,3],dtype="i8")
print(a1.dtype)
3、修改
dtype:
import numpy as np
a1 = np.array([1,2,3])
print(a1.dtype) # window系统下默认是int32
# 以下修改dtype
a2 = a1.astype(np.int64) # astype不会修改数组本身,而是会将修改后的结果返回
print(a2.dtype)
ndarray.size
:
获取数组中总的元素的个数。比如有个二维数组:
import numpy as np
a1 = np.array([[1,2,3],[4,5,6]])
print(a1.size) #打印的是6,因为总共有6个元素
ndarray.ndim
:
数组的维数。比如:
a1 = np.array([1,2,3])
print(a1.ndim) # 维度为1
a2 = np.array([[1,2,3],[4,5,6]])
print(a2.ndim) # 维度为2
a3 = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
print(a3.ndim) # 维度为3
ndarray.shape
:
数组的维度的元组。比如以下代码:
a1 = np.array([1,2,3])
print(a1.shape) # 输出(3,),意思是一维数组,有3个数据
a2 = np.array([[1,2,3],[4,5,6]])
print(a2.shape) # 输出(2,3),意思是二位数组,2行3列
a3 = np.array([
[
[1,2,3],
[4,5,6]
],
[
[7,8,9],
[10,11,12]
]
])
print(a3.shape) # 输出(2,2,3),意思是三维数组,总共有2个元素,每个元素是2行3列的
a44 = np.array([1,2,3],[4,5])
print(a4.shape) # 输出(2,),意思是a4是一个一维数组,总共有2列
print(a4) # 输出[list([1, 2, 3]) list([4, 5])],其中最外面层是数组,里面是Python列表
另外,我们还可以通过ndarray.reshape
来重新修改数组的维数。示例代码如下:
a1 = np.arange(12) #生成一个有12个数据的一维数组
print(a1)
a2 = a1.reshape((3,4)) #变成一个2维数组,是3行4列的
print(a2)
a3 = a1.reshape((2,3,2)) #变成一个3维数组,总共有2块,每一块是2行2列的
print(a3)
a4 = a2.reshape((12,)) # 将a2的二维数组重新变成一个12列的1维数组
print(a4)
a5 = a2.flatten() # 不管a2是几维数组,都将他变成一个一维数组
print(a5)
注意,reshape
并不会修改原来数组本身,而是会将修改后的结果返回。如果想要直接修改数组本身,那么可以使用resize
来替代reshape
。
ndarray.itemsize
:
数组中每个元素占的大小,单位是字节。比如以下代码:
a1 = np.array([1,2,3],dtype=np.int32)
print(a1.itemsize) # 打印4,因为每个字节是8位,32位/8=4个字节
jupyter:
总结:
1、数组一般达到3维就已经很复杂了,不太方便计算了,所以我们一般都会把3维以上的数组转换成2维数组来计算
2、通过ndarray.ndim可以看到数组的维度
3、通过ndarray.shape可以看到数组的形状(几行几列),shape是一个元组,里面又几个元素代表是几维数组
4、通过ndarray.reshape可以修改数组的形状。条件只有一个,就是修改后的形状的元素个数必须和原来一致。
reshape不会修改原来数组的形状,只会将修改完的结果返回
5、通过ndarray.size可以看到数组有多少个元素。
6、通过ndarray.itemsize可以看到数组中的每个元素所占内存的大小,单位是字节(一个字节 = 8个单位)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能