北京市专业网站建设,河南省工程建设信息官方网站,wordpress custom search,企业建立网站主要包括那些流程9.迭代数组
nditer 是 NumPy 中的一个强大的迭代器对象#xff0c;用于高效地遍历多维数组。nditer 提供了多种选项和控制参数#xff0c;使得数组的迭代更加灵活和高效。
控制参数
nditer 提供了多种控制参数#xff0c;用于控制迭代的行为。
1.order 参数
order 参数…9.迭代数组
nditer 是 NumPy 中的一个强大的迭代器对象用于高效地遍历多维数组。nditer 提供了多种选项和控制参数使得数组的迭代更加灵活和高效。
控制参数
nditer 提供了多种控制参数用于控制迭代的行为。
1.order 参数
order 参数用于指定数组的遍历顺序。默认情况下nditer 按照 C 风格行优先遍历数组。 C 风格行优先: orderC Fortran 风格列优先: orderF
# 创建一个二维数组
arr np.array([[1, 2, 3], [4, 5, 6]])
# 使用 C 风格遍历数组
for x in np.nditer(arr, orderC):print(x)
# 输出:
# 1
# 2
# 3
# 4
# 5
# 6
# 使用 Fortran 风格遍历数组
for x in np.nditer(arr, orderF):print(x)
# 输出:
# 1
# 4
# 2
# 5
# 3
# 6
2.flags 参数
flags 参数用于指定迭代器的额外行为。 multi_index: 返回每个元素的多维索引。 external_loop: 返回一维数组而不是单个元素减少函数调用的次数从而提高性能。
# 创建一个三维数组arr np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# 使用 nditer 遍历数组并获取多维索引it np.nditer(arr, flags[multi_index])for x in it:print(fElement: {x}, Index: {it.multi_index})
# 输出
# Element: 1, Index: (0, 0, 0)
# Element: 2, Index: (0, 0, 1)
# Element: 3, Index: (0, 1, 0)
# Element: 4, Index: (0, 1, 1)
# Element: 5, Index: (1, 0, 0)
# Element: 6, Index: (1, 0, 1)
# Element: 7, Index: (1, 1, 0)
# Element: 8, Index: (1, 1, 1)
# 创建一个二维数组
arr np.array([[1, 2, 3], [4, 5, 6]])
# 使用外部循环遍历数组
for x in np.nditer(arr, flags[external_loop], orderF):print(x)
# 输出:
# [1 4]
# [2 5]
# [3 6]
3.op_flags 参数
op_flags 参数用于指定操作数的行为。 readonly: 只读操作数。 readwrite: 读写操作数。 writeonly: 只写操作数。
# 创建一个二维数组
arr np.array([[1, 2, 3], [4, 5, 6]])
# 使用读写操作数遍历数组
for x in np.nditer(arr, op_flags[readwrite]):x[...] 2 * x
print(arr)
# 输出:
# [[ 2 4 6]
# [ 8 10 12]]
10.数组操作
10.1 数组变维
函数名称函数介绍reshape在不改变数组元素的条件下修改数组的形状flat返回是一个迭代器可以用 for 循环遍历其中的每一个元素flatten以一维数组的形式返回一份数组的副本对副本的操作不会影响到原数组ravel返回一个连续的扁平数组即展开的一维数组与 flatten不同它返回的是数组视图修改视图会影响原数组
10.1.1 flat
返回一个一维迭代器用于遍历数组中的所有元素。无论数组的维度如何ndarray.flat属性都会将数组视为一个扁平化的一维数组按行优先的顺序遍历所有元素。
语法
ndarray.flat
案例
import numpy as np
def flat_test():array_one np.arange(4).reshape(2,2)print(原数组元素)for i in array_one:print(i,end )print()print(使用flat属性遍历数组)for i in array_one.flat:print(i,end )
10.1.2 flatten()
用于将多维数组转换为一维数组。flatten() 返回的是原数组的一个拷贝因此对返回的数组进行修改不会影响原数组。
语法
ndarray.flatten(orderC)
参数
order: 指定数组的展开顺序。 C按行优先顺序展开默认。 F按列优先顺序展开。 A如果原数组是 Fortran 连续的则按列优先顺序展开否则按行优先顺序展开。 K按元素在内存中的顺序展开。
案例
import numpy as np
# 创建一个二维数组
arr np.array([[1, 2, 3], [4, 5, 6]])
# 使用 flatten 方法按行优先顺序展开
flat_arr arr.flatten(orderC)
print(flat_arr)
# 输出:
# [1 2 3 4 5 6]
1.3 ravel()
用于将多维数组转换为一维数组。与 flatten() 不同ravel() 返回的是原数组的一个视图view而不是拷贝。因此对返回的数组进行修改会影响原数组。
语法
ndarray.ravel()
参数
order: 指定数组的展开顺序。 C按行优先顺序展开默认。 F按列优先顺序展开。 A如果原数组是 Fortran 连续的则按列优先顺序展开否则按行优先顺序展开。 K按元素在内存中的顺序展开。
案例
import numpy as np
# 创建一个二维数组
arr np.array([[1, 2, 3], [4, 5, 6]])
# 使用 ravel 方法按行优先顺序展开
ravel_arr arr.ravel()
print(ravel_arr)
# 输出:
# [1 2 3 4 5 6]
ravel_arr[-1] 7
print(arr)
# 输出:
# [[1 2 3]
# [4 5 7]]
10.2 数组转置
函数名称说明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)
10.3 修改数组维度
多维数组也称为 ndarray的维度或轴是从外向内编号的。这意味着最外层的维度是轴0然后是轴1依此类推。
函数名称参数说明expand_dims(arr, axis)arr输入数组 axis新轴插入的位置在指定位置插入新的轴(相对于结果数组而言)从而扩展数组的维度squeeze(arr, axis)arr输入数的组 axis取值为整数或整数元组用于指定需要删除的维度所在轴指定的维度值必须为 1 否则将会报错若为 None则删除数组维度中所有为 1 的项删除数组中维度为 1 的项
案例
import numpy as np
def expand_dims_test():array_one np.arange(4).reshape(2,2)print(原数组\n, array_one)print(原数组维度情况\n, array_one.shape)# 在 1 轴处插入新的轴array_two np.expand_dims(array_one, axis1)print(在 1 轴处插入新的轴后的数组\n, array_two)print(在 1 轴处插入新的轴后的数组维度情况\n, array_two.shape)
def squeeze_test():array_one np.arange(6).reshape(2,1,3)print(原数组\n, array_one)print(原数组维度情况\n, array_one.shape)# 删除array_two np.squeeze(array_one,1)print(从数组的形状中删除一维项后的数组\n, array_two)print(从数组的形状中删除一维项后的数组维度情况\n, array_two.shape)
10.4 连接数组
函数名称参数说明hstack(tup)tup可以是元组列表或者numpy数组返回结果为numpy的数组按水平顺序堆叠序列中数组列方向vstack(tup)tup可以是元组列表或者numpy数组返回结果为numpy的数组按垂直方向堆叠序列中数组行方向
hstack函数要求堆叠的数组在垂直方向行上具有相同的形状。如果行数不一致hstack() 将无法执行并会抛出 ValueError 异常。
hstack() 要求堆叠的数组在垂直方向行上具有相同的形状。如果列数不一致将无法执行堆叠操作。
vstack() 和 hstack() 要求堆叠的数组在某些维度上具有相同的形状。如果维度不一致将无法执行堆叠操作。
案例
hstack
import numpy as np
# 创建两个形状不同的数组
arr1 np.array([[1, 2], [3, 4]])
arr2 np.array([[5], [6]])
print(arr1.shape) # (2, 2)
print(arr2.shape) # (2, 1)
# 使用 hstack 水平堆叠数组
result np.hstack((arr1, arr2))
print(result)
# 输出
# [[1 2 5]
# [3 4 6]]
# 创建两个形状不同的数组
arr1 np.array([[1, 2], [3, 4]])
arr2 np.array([[5], [6], [7]])
print(arr1.shape) # (2, 2)
print(arr2.shape) # (3, 1)
# 使用 hstack 水平堆叠数组
result np.hstack((arr1, arr2))
print(result)
# ValueError: all the input array dimensions except for the concatenation axis must match exactly
# 第一个数组在第0维有2个元素而第二个数组在第0维有3个元素因此无法直接连接。
vstack
# 创建两个一维数组
arr1 np.array([1, 2, 3])
arr2 np.array([4, 5, 6])
# 使用 vstack 垂直堆叠数组
result np.vstack((arr1, arr2))
print(result)
# 输出:
# [[1 2 3]
# [4 5 6]]
# 创建两个形状不同的数组
arr1 np.array([[1, 2], [3, 4]])
arr2 np.array([[5, 6, 7], [8, 9, 10]])
# 使用 vstack 垂直堆叠数组
result np.vstack((arr1, arr2))
print(result)
# ValueError: all the input array dimensions except for the concatenation axis must match exactly
# 第一个数组在第1维有2个元素而第二个数组在第1维有3个元素因此无法直接连接。
10.5 分割数组
函数名称参数说明hsplit(ary, indices_or_sections)ary原数组 indices_or_sections按列分割的索引位置将一个数组水平分割为多个子数组按列vsplit(ary, indices_or_sections)ary原数组 indices_or_sections按列分割的索引位置将一个数组垂直分割为多个子数组按行
案例
import numpy as np
hsplit 函数1、将一个数组水平分割为多个子数组按列2、ary原数组3、indices_or_sections按列分割的索引位置# 创建一个二维数组
arr np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
# 使用 np.hsplit 将数组分割成三个子数组
# 分割点在索引1和3处这意味着
# 第一个子数组将包含从第0列到索引1不包括索引1的列即第0列。
# 第二个子数组将包含从索引1包括索引1到索引3不包括索引3的列即第1列到第2列。
# 第三个子数组将包含从索引3包括索引3到末尾的列即第3列。
result np.hsplit(arr, [1, 3])
# 查看结果
print(第一个子数组:\n, result[0]) # 输出包含第0列的子数组
print(第二个子数组:\n, result[1]) # 输出包含第1列和第2列的子数组
print(第三个子数组:\n, result[2]) # 输出包含第3列的子数组
vsplit 函数1、将一个数组垂直分割为多个子数组按行2、ary原数组3、indices_or_sections按列分割的索引位置array_one np.arange(12).reshape(2,6)
print(array_one 原数组\n, array_one)
array_two np.vsplit(array_one,[1])
print(vsplit 之后的数组\n, array_two)
11.数组元素的增删改查
11.1 resize
函数名称参数说明resize(a, new_shape)a操作的数组 new_shape返回的数组的形状如果元素数量不够重复数组元素来填充新的形状返回指定形状的新数组
案例
import numpy as np
array_one np.arange(6).reshape(2, 3)
print(array_one)
print(resize 后数组\n, np.resize(array_one, (3, 4)))
# 输出
# [[0 1 2 3]
# [4 5 0 1]
# [2 3 4 5]]
最后一行代码将数组形状修改为(3, 4)原数组的元素数量不够则重复原数组的元素填充。
11.2 append
函数名称参数说明append(arr, values, axisNone)arr输入的数组 values向 arr 数组中添加的值需要和 arr 数组的形状保持一致 axis默认为 None返回的是一维数组当 axis 0 时追加的值会被添加到行而列数保持不变若 axis1 则与其恰好相反在数组的末尾添加值返回一个一维数组
案例
append(arr, values, axisNone) 函数1、将元素值添加到数组的末尾返回一个一维数组2、arr输入的数组3、values向 arr 数组中添加的值需要和 arr 数组的形状保持一致4、axis默认为 None返回的是一维数组当 axis 0 时追加的值会被添加到行而列数保持不变若 axis1 则与其恰好相反def append_test():array_one np.arange(6).reshape(2,3)print(原数组\n, array_one)array_two np.append(array_one,[[1,1,1],[1,1,1]],axisNone)print(append 后数组 axisNone\n, array_two)array_three np.append(array_one, [[1, 1, 1], [1, 1, 1]], axis0)print(append 后数组 axis0\n, array_three)array_three np.append(array_one, [[1, 1, 1], [1, 1, 1]], axis1)print(append 后数组 axis1\n, array_three)
11.3 insert
函数名称参数说明insert(arr, obj, values, axis)arr输入的数组 obj表示索引值在该索引值之前插入 values 值 values要插入的值 axis默认为 None返回的是一维数组当 axis 0 时追加的值会被添加到行而列数保持不变若 axis1 则与其恰好相反沿规定的轴将元素值插入到指定的元素前
案例
import numpy as np
def insert_test():array_one np.arange(6).reshape(2,3)print(原数组\n, array_one)array_two np.insert(array_one, 1, [6],axisNone)print(insert 后数组 axisNone\n, array_two)array_three np.insert(array_one,1, [6], axis0)print(insert 后数组 axis0\n, array_three)array_three np.insert(array_one, 1, [6,7], axis1)print(insert 后数组 axis1\n, array_three)
如果obj为-1表示插入在倒数第一个元素之前。
11.4 delete
函数名称参数说明delete(arr, obj, axis)arr输入的数组 obj表示索引值在该索引值之前插入 values 值 axis默认为 None返回的是一维数组当 axis 0 时删除指定的行若 axis1 则与其恰好相反删掉某个轴上的子数组并返回删除后的新数组
案例
一维数组
import numpy as np
# 创建一个 NumPy 数组
arr np.array([1, 2, 3, 4, 5, 6])
# 删除索引为 2 和 4 的元素
new_arr np.delete(arr, [2, 4])
print(new_arr)
二维数组
import numpy as np
def delete_test():array_one np.arange(6).reshape(2,3)print(原数组\n, array_one)array_two np.delete(array_one,1,axisNone)print(delete 后数组 axisNone\n, array_two)array_three np.delete(array_one,1, axis0)print(delete 后数组 axis0\n, array_three)array_three np.delete(array_one, 1, axis1)print(delete 后数组 axis1\n, array_three)
11.5 argwhere
返回数组中非 0 元素的索引若是多维数组则返回行、列索引组成的索引坐标
案例
import numpy as np
argwhere(a) 函数1、返回数组中非 0 元素的索引若是多维数组则返回行、列索引组成的索引坐标def argwhere_test():array_one np.arange(6).reshape(2,3)print(原数组\n, array_one)print(argwhere 返回非0元素索引\n, np.argwhere(array_one))print(argwhere 返回所有大于 1 的元素索引\n, np.argwhere(array_one 1))
11.6 unique
函数名称参数说明unique(ar, return_indexFalse, return_inverseFalse, return_countsFalse, axisNone)ar输入的数组 return_index如果为 True则返回新数组元素在原数组中的位置索引 return_inverse如果为 True则返回原数组元素在新数组中的位置逆索引 return_counts如果为 True则返回去重后的数组元素在原数组中出现的次数删掉某个轴上的子数组并返回删除后的新数组
案例1返回唯一元素的索引
import numpy as np
# 创建一个 NumPy 数组
arr np.array([1, 2, 2, 3, 4, 4, 5])
unique_elements, indices np.unique(arr, return_indexTrue)
print(unique_elements)
print(indices)
案例2返回唯一元素及其逆索引
mport numpy as np
# 创建一个一维数组
arr np.array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4])
# 使用 np.unique 查找唯一元素及其逆索引
unique_elements, inverse_indices np.unique(arr, return_inverseTrue)
print(unique_elements)
# 输出:
# [1 2 3 4]
print(inverse_indices)
# 输出:
# [0 1 1 2 2 2 3 3 3 3]
# 逆索引数组表示原始数组中的每个元素在唯一元素数组中的位置。
案例3返回唯一元素的计数
import numpy as np
# 创建一个一维数组
arr np.array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4])
# 使用 np.unique 查找唯一元素及其计数
unique_elements, counts np.unique(arr, return_countsTrue)
print(unique_elements)
# 输出:
# [1 2 3 4]
print(counts)
# 输出:
# [1 2 3 4]
对于多维数组unique 函数同样适用。默认情况下unique 函数会将多维数组展平为一维数组然后查找唯一元素。
arr np.array([[1, 2], [2, 3], [1, 2]])
# 查找数组中的唯一元素
unique_elements np.unique(arr)
print(unique_elements) 12.统计函数
12.1 amin() 和 amax() 计算数组沿指定轴的最小值与最大值并以数组形式返回 对于二维数组来说axis1 表示沿着水平方向axis0 表示沿着垂直方向
案例
numpy.amin() 和 numpy.amax() 函数1、计算数组沿指定轴的最小值与最大值并以数组形式返回2、对于二维数组来说axis1 表示沿着水平方向axis0 表示沿着垂直方向def amin_amax_test():array_one np.array([[1,23,4,5,6],[1,2,333,4,5]])print(原数组元素\n, array_one)print(原数组水平方向最小值\n, np.amin(array_one, axis1))print(原数组水平方向最大值\n, np.amax(array_one, axis1))print(原数组垂直方向最小值\n, np.amin(array_one, axis0))print(原数组垂直方向最大值\n, np.amax(array_one, axis0))
输出
原数组元素[[ 1 23 4 5 6][ 1 2 333 4 5]]
原数组水平方向最小值[1 1]
原数组水平方向最大值[ 23 333]
原数组垂直方向最小值[1 2 4 4 5]
原数组垂直方向最大值[ 1 23 333 5 6]
按1轴求最小值表示在最内层轴中每列中分别找最小值按0轴求最小值表示在最外层轴中所有行中按列找最小值。求最大值类似。
12.2 ptp() 计算数组元素中最值之差值即最大值 - 最小值 对于二维数组来说axis1 表示沿着水平方向axis0 表示沿着垂直方向
# 创建一个二维数组
arr np.array([[1, 2, 3], [4, 5, 6]])
# 使用 np.ptp 计算峰峰值
ptp_value np.ptp(arr)
print(ptp_value)
# 输出:
# 5
# 使用 np.ptp 按行计算峰峰值
ptp_values_row np.ptp(arr, axis1)
# 使用 np.ptp 按列计算峰峰值
ptp_values_col np.ptp(arr, axis0)
print(ptp_values_row)
# 输出:
# [2 2]
print(ptp_values_col)
# 输出:
# [3 3 3]
12.3 median()
用于计算中位数中位数是指将数组中的数据按从小到大的顺序排列后位于中间位置的值。如果数组的长度是偶数则中位数是中间两个数的平均值。
# 创建一个二维数组
arr np.array([[1, 2, 3], [4, 5, 6]])
# 使用 np.median 计算中位数
median_value np.median(arr,axisNone)
print(median_value)
# 输出:
# 3.5
# 使用 np.median 按行计算中位数
median_values_row np.median(arr, axis1)
# 使用 np.median 按列计算中位数
median_values_col np.median(arr, axis0)
print(median_values_row)
# 输出:
# [2. 5.]
print(median_values_col)
# 输出:
# [2.5 3.5 4.5]
12.4 mean()
沿指定的轴计算数组中元素的算术平均值即元素之总和除以元素数量
# 创建一个一维数组
arr np.array([1, 2, 3, 4, 5])
# 使用 np.mean 计算平均值
mean_value np.mean(arr)
print(mean_value)
# 输出:
# 3.0
# 创建一个二维数组
arr np.array([[1, 2, 3], [4, 5, 6]])
# 使用 np.mean 计算平均值
mean_value np.mean(arr)
print(mean_value)
# 输出:
# 3.5
# 使用 np.mean 按行计算平均值
mean_values_row np.mean(arr, axis1)
# 使用 np.mean 按列计算平均值
mean_values_col np.mean(arr, axis0)
print(mean_values_row)
# 输出:
# [2. 5.]
print(mean_values_col)
# 输出:
# [2.5 3.5 4.5]
6、average()
加权平均值是将数组中各数值乘以相应的权数然后再对权重值求总和最后以权重的总和除以总的单位数即因子个数根据在数组中给出的权重计算数组元素的加权平均值。该函数可以接受一个轴参数 axis如果未指定则数组被展开为一维数组。
$$ 加权平均值\dfrac{∑_{i1}^n(x_i⋅w_i)}{∑_{i1}^nw_i} $$ 其中 xi是数组中的元素wi是对应的权重。
如果所有元素的权重之和等于1则表示为数学中的期望值。
# 创建一个一维数组arr np.array([1, 2, 3, 4, 5])
# 创建权重数组weights np.array([0.1, 0.2, 0.3, 0.2, 0.2])
# 使用 np.average 计算加权平均值average_value np.average(arr, weightsweights)
print(average_value)# 输出:# 3.2
7、var()
在 NumPy 中计算方差时使用的是统计学中的方差公式而不是概率论中的方差公式主要是因为 NumPy 的设计目标是处理实际数据集而不是概率分布。
np.var 函数默认计算的是总体方差Population Variance而不是样本方差Sample Variance。
总体方差
对于一个总体数据集 X{x1,x2,…,xN}总体方差的计算公式为
$$ σ^2\dfrac{1}{N}∑_{i1}^N(x_i−μ)^2 $$ 其中 N是总体数据点的总数。 μ是总体的均值。
# 创建一个数组
arr np.array([1, 2, 3, 4, 5])
# 计算方差
variance np.var(arr)
print(variance)
#输出2
样本方差
对于一个样本数据集 X{x1,x2,…,xn}样本方差 的计算公式为
$$ s^2\dfrac{1}{n−1}∑_{i1}^n(x_i−\overline x)^2 $$ 其中 n是样本数据点的总数。 xˉ是样本的均值。
在样本数据中样本均值的估计会引入一定的偏差。通过使用 n−1n−1 作为分母可以校正这种偏差得到更准确的总体方差估计。
# 创建一个数组
arr np.array([1, 2, 3, 4, 5])
# 计算方差
variance np.var(arr, ddof1)
print(variance)
#输出2.5
8、std()
标准差是方差的算术平方根用来描述一组数据平均值的分散程度。若一组数据的标准差较大说明大部分的数值和其平均值之间差异较大若标准差较小则代表这组数值比较接近平均值
# 创建一个数组
arr np.array([1, 2, 3, 4, 5])
# 计算标准差
std_dev np.std(arr)
print(std_dev)
# 输出1.4142135623730951