人工智能学习基础——数组
返回一个元组,元组中的每个元素表示数组在对应维度上的大小。元组的长度等于数组的维度数。shape 属性功能:1.返回一个由数组维度构成的元组2.通过赋值,可以用来调整数组维度的大小注意:如果使用shape属性修改数组的形状,则修改的是原数组的形状,reshape修改数组的形状会返回一个新数组,不修改原数组的形状。
1.数组属性
1.1shape
返回一个元组,元组中的每个元素表示数组在对应维度上的大小。元组的长度等于数组的维度数。
shape 属性功能:
1.返回一个由数组维度构成的元组
2.通过赋值,可以用来调整数组维度的大小
def shape_test():
array_one = np.array([[1,2,3],[4,5,6]])
print('array_one 原数组维度:',array_one.shape)
print('array_one 原数组内容:',array_one)
array_one.shape = (3,2)
print('array_one 转变数组维度大小之后的数组维度:',array_one.shape)
print('array_one 转变数组维度大小之后的数组内容:',array_one)
注意:如果使用shape属性修改数组的形状,则修改的是原数组的形状,reshape修改数组的形状会返回一个新数组,不修改原数组的形状。
1.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)
1.3flags
flags 属性功能:
-
返回 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
说明:
C_CONTIGUOUS:
表示数组在内存中是 C 风格连续的(行优先)。
如果为 True,则数组是 C 风格连续的。
F_CONTIGUOUS:
表示数组在内存中是 Fortran 风格连续的(列优先)。
如果为 True,则数组是 Fortran 风格连续的。
2.切片
2.1slice()
在 Python 中,slice 可以作为一个对象来使用。你可以创建一个 slice 对象,然后使用它来获取序列的片段。
参数:
1.start 是切片开始的位置(包含该位置)。
2.stop 是切片结束的位置(不包含该位置)。
3.step 是切片的步长,即选取元素的间隔。
示例:
import numpy as np
def two():
array_one = np.array([[1, 2, 3], [4, 5, 6]])
print(array_one)
print(array_one[..., 1]) # 第2列元素
print(array_one[1,...]) # 第2行元素
print(array_one[1:2, 1:2]) # 第2行第2列元素
print(array_one[1:2])
print(array_one[..., 1:]) # 第2列及剩下的所有元素
冒号 : 的作用
-
表示范围: 冒号用于表示一个范围。例如,array[1:3] 表示从索引 1 到索引 3(不包括 3)的元素。
-
表示所有元素: 单独使用冒号表示所有元素。例如,array[:, 1] 表示所有行的第 1 列。
-
步长: 双冒号后面可以跟一个步长值,表示每隔多少个元素取一个。例如,array[::2] 表示每隔一个元素取一个。
注:冒号对于一维数组按索引号截取,二维数组按行和列截取。
省略号 ... 的作用
-
表示所有维度: 省略号用于表示数组的所有维度。例如,array[..., 1] 表示取所有行的第 1 列。
-
简化多维切片: 在多维数组中,省略号可以简化切片操作,避免显式地写出所有维度的索引。
注意:slice返回的数组是原数组的一个视图,修改数据会影响原数组中的数据。
3.高级索引
3.1整数数组索引
整数数组索引是指使用一个数组来访问另一个数组的元素。这个数组中的每个元素都是目标数组中某个维度上的索引值。
适用于需要访问非连续元素或特定位置元素的场景。
注意:返回的新数组是一个副本,修改它不会影响原数组。
案例:
import numpy as np
def one():
array_one = np.array([[1,2,3],[4,5,6]])
print(array_one)
# [0,1,0]代表行索引、[0,1,2]代表列索引;即取出索引坐标 (0,0)、(1,1)、(0,2) 的元素
array_one = array_one[[0,1,0],[0,1,2]]
print(array_one)
取出 4 * 3 数组四个角的数据:
import numpy as np
def two():
array_one = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print('原数组:\n',array_one)
array_one = array_one[[0,0,-1,-1], [0,-1,0,-1]]
print('这个数组的四个角元素是:')
print(array_one)
3.2布尔索引
布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。


4.广播(*)
#广播:将两个不同形状的数组进行数值计算
核心思想是将其中一个数组通过横向或纵向进行一定次数的数据重复,变成和另外一个数组形状相同后进行计算
前提:做数据重复的数组其中一个维度必须是1才能做广播
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = np.array([10,20,30])
# a的形状为(2,3);b的形状为(1,3),因为b中行的维度为1,可以通过广播机制进行数据重复,b重复行数据,变成(2,3),最终和a的形状相同可以进行数值相加
result = a+b
print(result)
5.遍历数组
5.1遍历一维数组
for i in arr: 遍历数组的第一维度,即按行或列的顺序逐个访问元素。
返回的是数组的子数组(如行或列),而不是单个元素。
5.2nditer逐个访问元素
nditer 是 NumPy 中的一个强大的迭代器对象,用于高效地遍历多维数组。nditer 提供了多种选项和控制参数,使得数组的迭代更加灵活和高效。
控制参数
nditer 提供了多种控制参数,用于控制迭代的行为。
1.order 参数
order 参数用于指定数组的遍历顺序。默认情况下,nditer 按照 C 风格(行优先)遍历数组。
1.C 风格(行优先): order='C'
2.Fortran 风格(列优先): order='F'
nditer迭代器
order参数:指定遍历顺序,C——按行遍历;F——按列遍历
flags参数:
multi_index:除了遍历元素之外,还将输出元素对应的下标值
external_loop:在遍历数组时,先将元素存在一个数组里,当遍历完成后将数组统一输出
a = np.array([[1,2,3],[4,5,6]])
for i in np.nditer(a,order='C'):
print(i,end=' ')
print()
for i in np.nditer(a,order='F'):
print(i,end=' ')
print()
it = np.nditer(a,flags=['multi_index'])
for i in it:
print(i,it.multi_index)
print()
for i in np.nditer(a,flags=['external_loop']):
print(i)
6.数组操作
6.1 reshape():
修改数组的形状
修改形状后产生一个新数组,新数组是原数组的一个视图,修改新数组会改变原数组
修改形状要保证数组中的元素个数不变
a = np.array([1,2,3,4,5,6,7,8,9])
a1 = a.reshape(3,3)
print(a1)
a1[0,0]=100
print(a1)
print(a)
print()
6.2占位符
-1的维度numpy会自动计算
a = np.arange(1,10).reshape(3,-1)
print(a)
6.3flat属性:
将多维数组生成一维数组的迭代器,允许遍历该迭代器获取数据
a = np.arange(1,7).reshape(2,3)
for i in a.flat:
print(i,end=' ')
6.4 flatten():
将多维数组扁平化为一维数组,生成的一维数组是原数组的副本,修改不影响原数组
a = np.arange(9).reshape(3,3)
a1 = a.flatten()
print(a1)
a1[0]=100
print(a)
6.5raval():
将多维数组扁平化为一维数组,生成数组是视图,会影响原数组
a2 = a.ravel()
print(a2)
a2[0]=100
print(a)
6.6数组转置
| 函数名称 | 说明 |
|---|---|
| transpose | 将数组的维度值进行对换,比如二维数组维度(2,4)使用该方法后为(4,2) |
| ndarray.T | 与 transpose 方法相同 |
示例:
import numpy as np
def transpose_test():
array_one = np.arange(12).reshape(3, 4)
print("原数组:")
print(array_one)
print("使用transpose()函数后的数组:")
print(np.transpose(array_one))
def T_test():
array_one = np.arange(12).reshape(3, 4)
print("原数组:")
print(array_one)
print("数组转置:")
print(array_one.T)
6.7升维和降维
多维数组(也称为 ndarray)的维度(或轴)是从外向内编号的。这意味着最外层的维度是轴0,然后是轴1,依此类推。
| 函数名称 | 参数 | 说明 |
|---|---|---|
| expand_dims(arr, axis) | arr:输入数组 axis:新轴插入的位置 | 在指定位置插入新的轴(相对于结果数组而言),从而扩展数组的维度 |
| squeeze(arr, axis) | arr:输入数的组 axis:取值为整数或整数元组,用于指定需要删除的维度所在轴,指定的维度值必须为 1 ,否则将会报错,若为 None,则删除数组维度中所有为 1 的项 | 删除数组中维度为 1 的项 |
示例1:增加维度
import numpy as np
# 创建一个一维数组
a = np.array([1, 2, 3])
print(a.shape) # 输出: (3,)
# 在第 0 维插入新维度
b = np.expand_dims(a, axis=0)
print(b)
# 输出:
# [[1 2 3]]
print(b.shape) # 输出: (1, 3)
# 在第 1 维插入新维度
c = np.expand_dims(a, axis=1)
print(c)
# 输出:
# [[1]
# [2]
# [3]]
print(c.shape) # 输出: (3, 1)
示例2:移除长度为1的维度
import numpy as np
# 创建一个数组
c = np.array([[[1, 2, 3]]])
print(c.shape) # 输出: (1, 1, 3)
# 移除第 0 维
d = np.squeeze(c, axis=0)
print(d)
# 输出:
# [[1 2 3]]
print(d.shape) # 输出: (1, 3)
# 移除第 1 维
e = np.squeeze(c, axis=1)
print(e)
# 输出:
# [[1 2 3]]
print(e.shape) # 输出: (1, 3)
# 移除第 2 维
f = np.squeeze(c, axis=2)
print(f)
# 输出:
# ValueError: cannot select an axis to squeeze out which has size not equal to one
print(f.shape)
更多推荐


所有评论(0)