numpy与ndarray数组
-
Numpy介绍
-
NumPy 提供了许多向量和矩阵操作,能让用户轻松完成最优化、线性代数、积分、插值、特殊函数、傅里叶变换、信号处理和图像处理、常微分方程求解以及其他科学与工程中常用的计算,不仅方便易用而且效率更高。
- NumPy 是一个开源的Python科学计算基础库,是SciPy、Pandas等数据处理或科学计算库的基础。
-
NumPy 为开放源代码并且由许多协作者共同维护开发
-
NumPy底层用C语言编写,内部解除了GIL(全局解释性锁),其对数组的操作速度不受python解释器的限制,处理速度快,效率远高于纯python代码。
-
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:
-
一个强大的N维数组对象 ndarray
-
线性代数、傅里叶变换、随机数生成等功能
-
ndarray数组
-
NumPy中定义的最重要的对象是称为ndarray的N维数组对象(矩阵),它描述相同类型的元素集合。ndarray对象由计算机内存中的一维连续区域组成,ndarray中的每个元素在内存中使用相同大小的块
-
ndarray由两部分构成:
-
①实际的数据;
-
②描述这些数据的元数据(数据维度、数据类型等)
-
ndarray有两个基本的概念:
-
①轴(axis):保存数据的维度
-
②秩(rank):轴的数量,即这个数组有多少个维度
-
ndarray对象的属性
-
查看数组维度、形状、尺寸、元素类型等
-
属性
|
说明
|
.shape
|
ndarray对象维度的元组 |
.ndim
|
ndarray对象的维度
|
.size
|
ndarray对象中元素总数,相当于.shape中n*m的值 |
.dtype
|
ndarray对象的元素类型
|
.itemsize
|
ndarray对象中每个元素的大小,以字节为单位 |
# array的属性
def array_basic():
# 定义一个数组,这里是 3*4 的二维数组
arr = np.array([
[1, 3, 5, 7],
[2, 4, 6, 8],
[3, 6, 9, 12]
])
# 整个内容
print("Content:\n", arr)
# 维度,这里是二维矩阵数组
print("dimension:", arr.ndim)
# 形状,比如这里是(3, 4),三行四列
print("shape:", arr.shape)
# 尺寸,元素数量,这里是 3*4 = 12个
print("size:", arr.size)
# 元素数据类型
print("dtype:", arr.dtype)
# 每个元素的大小,以字节为单位
print("itemsize:", arr.itemsize)
-
ndarray的数据类型及精度
- ndarray支持这么多种元素类型的原因
- 科学计算涉及数据较多,对存储和性能都有较高要求。
- 对元素类型精细定义,有助于NumPy合理使用存储空间并优化性能。
- 对元素类型精细定义,有助于程序员对程序规模有合理评估。
类型
|
说明
|
int8, uint8
|
有符号和无符号的8位(1个字节)整型
|
int16, uint16
|
有符号和无符号的16位(2个字节)整型
|
int32, uint32
|
有符号和无符号的32位(4个字节)整型
|
int64, uint64
|
有符号和无符号的64位(8个字节)整型
|
float16
|
半精度浮点数
|
float32
|
标准的单精度浮点数。与C的float兼容
|
float64
|
标准的双精度浮点数。与C语言的double和python的float对象兼容
|
float128
|
扩展精度浮点数
|
complex64, complex128, complex256
|
分别用两个32位,64位,128位浮点数表示的复数
|
bool
|
布尔类型,True 和 False
|
object
|
python对象类型
|
string_
|
固定长度的字符串类型(每个字符一个字节)。例如:要创建一个长度为20的字符串,应使用S20
|
unicode_
|
固定长度的Unicode类型(字节数由平台决定)跟字符串的定义方式一样
|
-
ndarray的创建
参数
|
描述
|
object
|
一切序列型的对象,比如:列表、元组等
|
dtype
|
数组的所需数据类型,可选。
|
copy
|
默认为true,对象是否被复制,可选
|
order
|
C(按行)、F(按列)或 A(任意,默认)
|
subok
|
默认情况下,返回的数组被强制为基类数组。 如果为true,则返回子类。
|
ndmin
|
指定返回数组的最小维数。
|
array = numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
arr = np.array([1, 2, 3], dtype=np.float32)
-
arange() 创建范围内的等差数组
参数
|
说明
|
start
|
范围的起始值,默认为0
|
stop
|
范围的终止值(不包含)
|
step
|
步长,默认为1
|
dtype
|
指定填充值的数据类型,如果没有提供,则会使用输入数据的类型
|
array = numpy.arange(start, stop, step, dtype)
arr = np.arange(0, 12, 2, dtype=np.int64)
-
reshape()、zeros()、ones() 等
-
通过 zeros(),ones(),分别生成全0、全1数组
-
通过 reshape() 重置形状
# array
def numpy_array():
# dtype: 指定数据data的类型,这里是int64,即64位精度的int
arr = np.array([
[1, 5, 9, 13],
[2, 6, 10, 14]
], dtype=np.int64)
# 生成一个形状是 3行4列,类型是float32型的元素全为 0 的数组
arr0 = np.zeros(shape=(3, 4), dtype=np.float32)
print("arr0:\n", arr0)
# 生成一个形状是 3*2*4 类型是int64的元素全为 1 的数组
arr1 = np.ones(shape=(2, 2, 5), dtype=np.int64)
print("arr1:\n", arr1)
# 改变数组形状为 4*2
arr = arr.reshape(4, 2)
print("reshape(4, 2):\n", arr)
# 将数组转变成一维
print("reshape(-1):\n", arr.reshape(-1))