学前准备
需要提前安装下载好numpy模块,下载方式我就不列举出来了,大家可以上菜鸟教程或者CSDN上随便一搜都一大把。
介绍
Numpy是一个功能强大的库,它提供了一个重要的对象,即N维数组(Ndarray)。N维数组就是一组相同类型数据的集合,而且我们可以通过索引来访问这些数据。
可以把N维数组看作是一块内存中存储的数据,它的每个元素都占用相同的存储空间。
N维数组由以下几个部分组成:
-
数据(Data):Ndarray对象中存储的实际数据。数据可以是任意类型的,如整数、浮点数、布尔值等。数据以一维数组形式存储,但可以通过索引和切片操作来访问和处理多维数据。
-
维度(Dimension):Ndarray对象中数据的维度信息。维度表示数据数组的形状(shape),即各维度的大小。例如,一个二维数组的维度为(行数, 列数)。维度信息帮助我们理解和操作数组的结构。
-
数据类型(Data Type):Ndarray对象中数据的类型信息。数据类型决定了数据的存储方式和可执行的操作。例如,可以使用整数类型存储整数数据,使用浮点数类型存储实数数据。NumPy提供了丰富的数据类型选项,如int、float、bool等,以及不同精度的数值类型。
-
内存连接(Memory Contiguous):Ndarray对象中数据在内存中是一块连续的区域。这种连续的存储方式使得数据可以高效地处理和计算。Ndarray对象会记录数据在内存中的起始位置,并根据维度信息和数据类型,计算出每个元素在内存中的偏移量。
-
数据访问方式(Access Method):Ndarray对象支持通过索引、切片、布尔掩码等方式来访问和操作数据。通过索引和切片,可以获取指定元素或子数组;通过布尔掩码,可以根据条件来过滤和选取数据。
创建Ndarray对象
调用函数:
-
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
参数说明:
名称 | 描述 |
---|---|
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
实例演示
首先需要注意的是,我们在导入Numpy模块时,会默认给它一个简称np。
- import numpy as np
创建一个简单的Ndarray对象
import numpy as np
a = np.array([1, 2, 3])
print(a) # [1 2 3]
a = np.array([[1, 2], [3, 4]])
print(a)
'''
[[1 2]
[3 4]]
'''
a = np.array([1, 2], [3, 4])
# TypeError: Field elements must be 2- or 3-tuples, got '3'
通过这一示例,我们发现Ndarray对象和列表很相似,但是不同之处在于列表中两个数字之间由逗号隔开,而Ndarray对象中用的是空格隔开。
还有一点需要注意的,object只接受一个参数,所以在你传入多个数据参数如[1,2],[3,4]时会抛出异常。
dtype参数
dtype
: 定义创建数组内元素的数据类型
import numpy as np
a = np.array([1, 2, 3])
print(a) # [1 2 3]
a = np.array([1, 2, 3], dtype=float)
print(a) # [1. 2. 3.]
a = np.array([1, 2, 3], dtype=complex)
print(a) # [1.+0.j 2.+0.j 3.+0.j]
我们可以通过给定不同的dtype值给数据设定不同的数据类型。
copy参数
copy
: 这个参数用于指定是否复制数据。如果copy为True(默认值),则会创建数组的副本;如果copy为False,则会使用传入的对象的数据来创建数组。
import numpy as np
a = np.array([1, 2, 3])
b = np.array(a, copy=True)
b[0] = 100
print(a) # [1 2 3]
print(b) # [100 2 3]
import numpy as np
a = np.array([1, 2, 3])
b = np.array(a, copy=False)
b[0] = 100
print(a) # [100 2 3]
print(b) # [100 2 3]
copy为True相当于深拷贝,指向不同指针域;copy为False相当于浅拷贝,指向相同指针域。
order参数
order
: 这个参数用于指定数组在内存中的存储方式。默认值是None,表示使用C风格的存储顺序,即逐行存储。如果指定为'F',则使用Fortran风格的存储顺序,即逐列存储。
import numpy as np
a = np.arange(6).reshape((2, 3))
arr1 = np.array(a, order='C')
arr2 = np.array(a, order='F')
print(arr1)
# 输出:
# [[0 1 2]
# [3 4 5]]
print(arr2)
# 输出:
# [[0 2 4]
# [1 3 5]]
subok参数
subok
: 这个参数用于控制返回的数组是否是子类(subclasses)数组。默认值是False,表示返回的数组不是子类数组。如果subok为True,则返回的数组可以是输入对象的子类数组。
import numpy as np
# 创建矩阵
a = np.mat([1, 2, 3, 4])
# 输出为矩阵类型
print(type(a)) # <class 'numpy.matrix'>
# 既要赋值一份副本,又要保持原类型
T = np.array(a, subok=True)
F = np.array(a) # 默认为False
print('T.subok为True:', type(T)) # T.subok为True: <class 'numpy.matrix'>
print('F.subok为False:', type(F)) # F.subok为False: <class 'numpy.ndarray'>
ndmin参数
ndmin
: 定义创建数组的维度
import numpy as np
a = np.array([1, 2, 3, 4, 5], ndmin = 2)
print (a) # [[1,2,3,4,5]]
传入参数不匹配
# 输入数组为嵌套数组时,需要定义dtype=object,否则抛出异常
a = np.array([1, 2, [1, 4, 3], 3], dtype=object)
print(a) # [1 2 list([1, 4, 3]) 3]
# 当输入列表长度不匹配时,需要定义dtype=object,否则抛出异常
a = np.array([[1, 2, 3, 7], [1, 4, 3]], dtype=object)
print(a) # [list([1, 2, 3, 7]) list([1, 4, 3])]
此时输出的数组仍是一维数组,只不过它将列表对象看做了一个参数。