当前位置: 首页 > article >正文

Python包——numpy2

9.迭代数组

        nditer 是 NumPy 中的一个强大的迭代器对象,用于高效地遍历多维数组。nditer 提供了多种选项和控制参数,使得数组的迭代更加灵活和高效。

控制参数

nditer 提供了多种控制参数,用于控制迭代的行为。

主要参数

  1. op:要迭代的数组或数组序列。可以是单个数组或多个数组组成的列表或元组。
  2. flags:控制迭代器行为的标志。常用标志包括:
    • 'external_loop':使迭代器返回数组的外部维度(如二维数组的行)作为一维数组,而不是单个元素。
    • 'c_index':通过迭代器的 index 属性跟踪 C 顺序(行优先)的索引。
    • 'f_index':通过迭代器的 index 属性跟踪 Fortran 顺序(列优先)的索引。
    • 'multi_index':通过迭代器的 multi_index 属性获取当前元素的完整索引(多维索引)。
  3. op_flags:控制操作数组时的读写模式。常用值包括:
    • ['readwrite']:允许在迭代过程中读写数组元素。
    • ['writeonly']:只允许在迭代过程中写入数组元素(不常用)。
    • 默认为只读模式。
  4. order:控制遍历数组元素的顺序。常用值包括:
    • 'C':C 顺序,即行优先(默认)。
    • 'F':Fortran 顺序,即列优先。
    • 'K':保持数组元素在内存中的顺序。
    • 'A':与 'F' 顺序相同(遗留选项)。
  5. casting:控制数据类型转换的策略。常用值包括 'safe'(仅进行安全转换)和 'same_kind'(进行相似类型的转换)。

 

# 创建一个三维数组
    arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

    # 使用 nditer 遍历数组并获取多维索引
    it = np.nditer(arr, flags=['multi_index'])
    for x in it:
        print(f"Element: {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'], order='F'):
    print(x)
# 输出:
# [1 4]
# [2 5]
# [3 6]

10.数组操作

10.1数组变维

函数名称函数介绍
reshape在不改变数组元素的条件下,修改数组的形状
flat返回是一个迭代器,可以用 for 循环遍历其中的每一个元素
flatten以一维数组的形式返回一份数组的副本,对副本的操作不会影响到原数组
ravel返回一个连续的扁平数组(即展开的一维数组),与 flatten不同,它返回的是数组视图(修改视图会影响原数组)

10.1.1 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() 返回的是原数组的一个拷贝,因此对返回的数组进行修改不会影响原数组。

参数

order: 指定数组的展开顺序。

  • 'C':按行优先顺序展开(默认)。

  • 'F':按列优先顺序展开。

  • 'A':如果原数组是 Fortran 连续的,则按列优先顺序展开;否则按行优先顺序展开。

  • 'K':按元素在内存中的顺序展开。

import numpy as np

# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])

# 使用 flatten 方法按行优先顺序展开
flat_arr = arr.flatten(order='C')

print(flat_arr)
# 输出:
# [1 2 3 4 5 6]

10.1.3 ravel()

        用于将多维数组转换为一维数组。与 flatten() 不同,ravel() 返回的是原数组的一个视图(view),而不是拷贝。因此,对返回的数组进行修改会影响原数组。

参数

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 的项

 10.3.1numpy.expand_dims(a, axis)

  • a:输入的数组。
  • axis:指定在哪个轴上插入新的维度。轴的编号从0开始,负值表示从最后一个轴开始计数(例如,-1 表示最后一个轴)。如果 axis 的值大于或等于输入数组的轴数,那么新的维度将被添加到数组的末尾。
  • 返回值是一个新数组,其形状与输入数组相同,但在指定的轴上增加了一个大小为1的维度。
import numpy as np  
  
# 创建一个一维数组  
arr = np.array([1, 2, 3])  
  
# 在轴0上增加维度(变为列向量)  
arr_expanded_axis0 = np.expand_dims(arr, axis=0)  
print("Expanded on axis 0:\n", arr_expanded_axis0)  
# 输出:  
# [[1 2 3]]  
  
# 在轴1上增加维度(变为行向量)  
arr_expanded_axis1 = np.expand_dims(arr, axis=1)  
print("Expanded on axis 1:\n", arr_expanded_axis1)  
# 输出:  
# [[1]  
#  [2]  
#  [3]]  
  
# 创建一个二维数组  
arr_2d = np.array([[1, 2], [3, 4]])  
  
# 在轴2上增加维度(变为三维数组,最后一个维度大小为1)  
arr_expanded_axis2 = np.expand_dims(arr_2d, axis=2)  
print("Expanded on axis 2:\n", arr_expanded_axis2)  
# 输出:  
# [[[1]  
#   [2]]  
#  
#  [[3]  
#   [4]]]

10.3.2squeeze(arr, axis)

  • a:输入的数组。
  • axis:用于指定需要被压缩的轴的编号。如果为 None(默认值),则所有大小为1的轴都将被压缩。如果指定了 axis,则只有该轴(或其负值对应的轴,表示从最后一个轴开始计数)在大小为1时才会被压缩。如果指定的轴上大小不为1,则该操作不会改变数组的形状。
  • 返回值是一个新数组,其形状是输入数组形状中移除了所有(或指定)大小为1的维度后的结果。
import numpy as np  
  
# 创建一个三维数组,其中一个维度大小为1  
arr = np.array([[[1], [2]], [[3], [4]]])  
  
# 移除所有大小为1的维度  
arr_squeezed = np.squeeze(arr)  
print("Squeezed all single dimensions:\n", arr_squeezed)  
# 输出:  
# [[1 2]  
#  [3 4]]  
  
# 创建一个二维数组,没有大小为1的维度  
arr_2d = np.array([[1, 2], [3, 4]])  
  
# 尝试移除(但因为没有大小为1的维度,所以形状不变)  
arr_2d_squeezed = np.squeeze(arr_2d)  
print("Squeezed 2D array (no change):\n", arr_2d_squeezed)  
# 输出:  
# [[1 2]  
#  [3 4]]  
  
# 创建一个三维数组,并指定只移除第二个维度(大小为1的维度)  
arr_with_middle_dim = np.array([[[1, 2]], [[3, 4]]])  
arr_squeezed_middle = np.squeeze(arr_with_middle_dim, axis=1)  
print("Squeezed middle dimension:\n", arr_squeezed_middle)  
# 输出:  
# [[[1 2]]  
#  
#  [[3 4]]]  
# 注意:这里第二个维度(axis=1)被移除了,但因为第一个和最后一个维度仍然不是1,所以它们保留了下来。  
# 然而,这个特定的例子可能有些误导,因为通常我们期望squeeze能够移除所有大小为1的维度。  
# 在这个例子中,如果我们想要移除所有大小为1的维度,我们应该不指定axis参数。  
  
# 更正上面的误解,如果我们想要移除arr_with_middle_dim中所有大小为1的维度:  
arr_fully_squeezed = np.squeeze(arr_with_middle_dim)  
print("Fully squeezed array:\n", arr_fully_squeezed)  
# 输出:  
# [[1 2]  
#  [3 4]]

10.4 连接数组

函数名称参数说明
hstack(tup)tup:可以是元组,列表,或者numpy数组,返回结果为numpy的数组按水平顺序堆叠序列中数组(列方向)
vstack(tup)tup:可以是元组,列表,或者numpy数组,返回结果为numpy的数组

按垂直方向堆叠序列中数组(行方向)

  • hstack函数要求堆叠的数组在垂直方向(行)上具有相同的形状。如果行数不一致,hstack() 将无法执行,并会抛出 ValueError 异常。
  • hstack() 要求堆叠的数组在垂直方向(行)上具有相同的形状。如果列数不一致,将无法执行堆叠操作。
  • vstack() 和 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])
arr2 = np.array([4, 5, 6])

# 使用 vstack 垂直堆叠数组
result = np.vstack((arr1, arr2))

print(result)
# 输出:
# [[1 2 3]
#  [4 5 6]]

10.5 分割数组

函数名称参数说明
hsplit(ary, indices_or_sections)ary:原数组 indices_or_sections:按列分割的索引位置将一个数组水平分割为多个子数组(按列)
vsplit(ary, indices_or_sections)ary:原数组 indices_or_sections:按列分割的索引位置将一个数组垂直分割为多个子数组(按行)
import numpy as np


# 创建一个二维数组
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
result = np.hsplit(arr, [1, 3])

# 查看结果
print("第一个子数组:\n", result[0])  # 输出包含第0列的子数组
print("第二个子数组:\n", result[1])  # 输出包含第1列和第2列的子数组
print("第三个子数组:\n", result[2])  # 输出包含第3列的子数组


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]]

11.2 append

函数名称参数说明
append(arr, values, axis=None)arr:输入的数组 values:向 arr 数组中添加的值,需要和 arr 数组的形状保持一致 axis:默认为 None,返回的是一维数组;当 axis =0 时,追加的值会被添加到行,而列数保持不变,若 axis=1 则与其恰好相反在数组的末尾添加值,返回一个一维数组
import numpy as np  
  
# 示例 1:向一维数组末尾添加单个值  
arr_1d = np.array([1, 2, 3])  
new_arr_1d = np.append(arr_1d, 4)  
print(new_arr_1d)  # 输出: [1 2 3 4]  
  
# 示例 2:向一维数组末尾添加数组  
arr_1d = np.array([1, 2, 3])  
values_to_add = np.array([4, 5])  
new_arr_1d = np.append(arr_1d, values_to_add)  
print(new_arr_1d)  # 输出: [1 2 3 4 5]  
  
# 示例 3:向二维数组沿指定轴添加值  
arr_2d = np.array([[1, 2], [3, 4]])  
values_to_add = np.array([[5, 6]])  # 注意这里的形状  
new_arr_2d = np.append(arr_2d, values_to_add, axis=0)  # 沿着行(axis=0)添加  
print(new_arr_2d)  # 输出:  
# [[1 2]  
#  [3 4]  
#  [5 6]]  
  
# 如果尝试沿着列(axis=1)添加不同形状的数组,将会出错:  
# values_to_add = np.array([5, 6])  # 这是一个一维数组  
# new_arr_2d = np.append(arr_2d, values_to_add, axis=1)  # 这将引发错误

11.3 insert

函数名称参数说明
insert(arr, obj, values, axis)arr:输入的数组 obj:表示索引值,在该索引值之前插入 values 值 values:要插入的值 axis:默认为 None,返回的是一维数组;当 axis =0 时,追加的值会被添加到行,而列数保持不变,若 axis=1 则与其恰好相反
import numpy as np  
  
# 示例 1:向一维数组指定索引前插入单个值  
arr_1d = np.array([1, 2, 4, 5])  
new_arr_1d = np.insert(arr_1d, 2, 3)  # 在索引2之前插入值3  
print(new_arr_1d)  # 输出: [1 2 3 4 5]  
  
# 示例 2:向一维数组指定索引前插入数组  
arr_1d = np.array([1, 2, 4, 5])  
values_to_insert = np.array([3, 30])  # 注意这里的形状  
# 由于我们只想在索引2之前插入一个值,我们需要选择values_to_insert中的一个元素  
# 或者调整arr_1d和values_to_insert的形状以匹配  
# 这里我们简单选择values_to_insert的第一个元素  
new_arr_1d = np.insert(arr_1d, 2, values_to_insert[0])  
print(new_arr_1d)  # 输出: [1 2 3 4 5]  
# 如果想插入整个数组,需要调整arr_1d的形状或选择另一个插入策略  
  
# 示例 3:向二维数组指定轴和索引前插入值  
arr_2d = np.array([[1, 2], [4, 5]])  
values_to_insert = np.array([3])  # 单个值,将被广播到适当的形状  
new_arr_2d = np.insert(arr_2d, 1, values_to_insert, axis=0)  # 沿着行(axis=0)在索引1之前插入  
print(new_arr_2d)  # 注意,由于values_to_insert是标量,它会被广播到与arr_2d的一行相同的形状  
# 输出:  
# [[1 2]  
#  [3 3]  # 这里3被广播到了整行,但通常我们期望插入的是与原始行形状相同的数组  
#  [4 5]]  
# 正确的做法应该是提供一个与arr_2d一行形状相同的数组作为values_to_insert  
  
# 正确的二维数组插入示例  
values_to_insert_correct = np.array([[3, 3]])  # 与arr_2d的一行形状相同  
new_arr_2d_correct = np.insert(arr_2d, 1, values_to_insert_correct, axis=0)  
print(new_arr_2d_correct)  # 输出:  
# [[1 2]  
#  [3 3]  
#  [4 5]]

11.4 delete

函数名称参数说明
delete(arr, obj, axis)arr:输入的数组 obj:表示索引值,在该索引值之前插入 values 值 axis:默认为 None,返回的是一维数组;当 axis =0 时,删除指定的行,若 axis=1 则与其恰好相反删掉某个轴上的子数组,并返回删除后的新数组
import numpy as np  
  
# 示例 1:从一维数组中删除指定索引的元素  
arr_1d = np.array([1, 2, 3, 4, 5])  
new_arr_1d = np.delete(arr_1d, 2)  # 删除索引为2的元素(值为3)  
print(new_arr_1d)  # 输出: [1 2 4 5]  
  
# 示例 2:从一维数组中删除多个指定索引的元素  
arr_1d = np.array([1, 2, 3, 4, 5])  
new_arr_1d = np.delete(arr_1d, [1, 3])  # 删除索引为1和3的元素(值为2和4)  
print(new_arr_1d)  # 输出: [1 3 5]  
  
# 示例 3:从二维数组中删除指定轴和索引的子数组  
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])  
new_arr_2d = np.delete(arr_2d, 1, axis=0)  # 沿着行(axis=0)删除索引为1的子数组(值为[4, 5, 6])  
print(new_arr_2d)  # 输出:  
# [[1 2 3]  
#  [7 8 9]]  
  
# 从二维数组中删除指定轴和索引的列  
new_arr_2d = np.delete(arr_2d, 1, axis=1)  # 沿着列(axis=1)删除索引为1的列(值为[2, 5, 8])  
print(new_arr_2d)  # 输出:  
# [[1 3]  
#  [4 6]  
#  [7 9]]

11.5 argwhere

返回数组中非 0 元素的索引,若是多维数组则返回行、列索引组成的索引坐标

import numpy as np  
  
# 示例 1:查找所有非零元素的索引  
arr = np.array([[1, 0, 2], [0, 3, 0], [4, 0, 5]])  
indices = np.argwhere(arr)  
print(indices)  
# 输出:  
# [[0 0]  
#  [0 2]  
#  [1 1]  
#  [2 0]  
#  [2 2]]  
  
# 示例 2:查找大于2的元素的索引  
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])  
indices = np.argwhere(arr > 2)  
print(indices)  
# 输出:  
# [[0 2]  
#  [1 0]  
#  [1 1]  
#  [1 2]  
#  [2 0]  
#  [2 1]  
#  [2 2]]

11.6 unique

函数名称参数说明
unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None)ar:输入的数组 return_index:如果为 True,则返回新数组元素在原数组中的位置(索引) return_inverse:如果为 True,则返回原数组元素在新数组中的位置(逆索引) return_counts:如果为 True,则返回去重后的数组元素在原数组中出现的次数删掉某个轴上的子数组,并返回删除后的新数组
import numpy as np  
  
# 示例 1:基本用法  
arr = np.array([1, 2, 2, 3, 4, 4, 5])  
unique_vals = np.unique(arr)  
print(unique_vals)  # 输出: [1 2 3 4 5]  
  
# 示例 2:返回唯一值在原始数组中的索引  
arr = np.array([[1, 1], [2, 3], [2, 1]])  
unique_vals, indices = np.unique(arr, return_index=True, axis=0)  
print(unique_vals)  # 输出: [[1 1]  
                   #        [2 3]  
                   #        [2 1]] 中的唯一行  
print(indices)  # 输出: [0 1 0] 这些是唯一行在原始数组中的索引(沿着行轴)  
  
# 示例 3:返回逆索引和出现次数  
arr = np.array([1, 2, 2, 3, 4, 4, 5])  
unique_vals, inverse_indices, counts = np.unique(arr, return_inverse=True, return_counts=True)  
print(unique_vals)  # 输出: [1 2 3 4 5]  
print(inverse_indices)  # 输出: [0 1 1 2 3 3 4] 可以使用这个数组来重构原始数组  
print(counts)  # 输出: [1 2 1 2 1] 每个唯一值出现的次数

12.统计函数

12.1 amin() 和 amax()

amin()

numpy.amin(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)
  • a:输入数组。
  • axis:指定沿哪个轴计算最小值。默认是 None,表示计算整个数组的最小值。如果是一个整数,表示沿该轴计算;如果是元组,表示沿多个轴计算。
  • out:可选参数,用于存储结果的数组。
  • keepdims:如果为 True,则保持输出的维度与输入相同。
  • initial:用于计算最小值的初始值。
  • where:可选参数,布尔数组,指定哪些元素参与计算。
import numpy as np  
  
arr = np.array([[1, 2, 3], [4, 5, 6]])  
  
# 计算整个数组的最小值  
min_val_all = np.amin(arr)  
print("整个数组的最小值:", min_val_all)  # 输出: 整个数组的最小值: 1  
  
# 沿着行计算最小值  
min_val_axis0 = np.amin(arr, axis=0)  
print("沿着行计算的最小值:", min_val_axis0)  # 输出: 沿着行计算的最小值: [1 2 3]  
  
# 沿着列计算最小值  
min_val_axis1 = np.amin(arr, axis=1)  
print("沿着列计算的最小值:", min_val_axis1)  # 输出: 沿着列计算的最小值: [1 4]

numpy.amax():参数与 numpy.amin() 相同,只是功能相反,计算的是最大值。

import numpy as np  
  
arr = np.array([[1, 2, 3], [4, 5, 6]])  
  
# 计算整个数组的最大值  
max_val_all = np.amax(arr)  
print("整个数组的最大值:", max_val_all)  # 输出: 整个数组的最大值: 6  
  
# 沿着行计算最大值  
max_val_axis0 = np.amax(arr, axis=0)  
print("沿着列计算的最大值:", max_val_axis0)  # 输出: 沿着行计算的最大值: [4 5 6]  
  
# 沿着列计算最大值  
max_val_axis1 = np.amax(arr, axis=1)  
print("沿着行计算的最大值:", max_val_axis1)  # 输出: 沿着列计算的最大值: [3 6]

12.2 ptp()

        在 NumPy 中,ptp() 函数用于计算数组元素沿指定轴的最大值与最小值之差(即峰值到峰值,peak-to-peak)。如果不指定轴,则默认在整个数组上计算。

import numpy as np  
  
# 创建一个二维数组  
arr = np.array([[1, 10, 3], [5, 6, 9], [2, 8, 7]])  
  
# 在整个数组上计算 ptp(最大值与最小值之差)  
print("整个数组的 ptp:", arr.ptp())  
  
# 沿着列(axis=0)计算 ptp  
# 这将返回每一列的最大值与最小值之差  
print("沿着列的 ptp:", arr.ptp(axis=0))  
  
# 沿着行(axis=1)计算 ptp  
# 这将返回每一行的最大值与最小值之差  
print("沿着行的 ptp:", arr.ptp(axis=1))

12.3 median()

        在 NumPy 中,median() 函数用于计算数组元素的中位数。中位数是将一组数据从小到大排序后,位于中间位置的数值。如果数据量是奇数,则中位数是中间那个数;如果数据量是偶数,则中位数是中间两个数的平均值。对于一维数组,median() 函数直接返回整个数组的中位数。对于二维或更高维度的数组,你可以通过指定 axis 参数来计算沿某个轴的中位数。

import numpy as np  
  
# 创建一个一维数组  
arr1 = np.array([1, 3, 5, 7, 9])  
print("一维数组的中位数:", arr1.median())  
  
# 创建一个二维数组  
arr2 = np.array([[1, 2, 3],  
                 [4, 5, 6],  
                 [7, 8, 9]])  
  
# 计算整个二维数组的中位数(将所有元素视为一个一维数组)  
print("整个二维数组的中位数:", np.median(arr2))  
  
# 沿着列(axis=0)计算中位数  
print("沿着列的中位数:", np.median(arr2, axis=0))  
  
# 沿着行(axis=1)计算中位数  
print("沿着行的中位数:", np.median(arr2, axis=1))


#一维数组的中位数: 5.0  
#整个二维数组的中位数: 5.0  
#沿着列的中位数: [4. 5. 6.]  
#沿着行的中位数: [2. 5. 8.]

12.4 mean()

        在 NumPy 中,mean() 函数用于计算数组元素的平均值(或均值)。对于一维数组,它返回整个数组元素的平均值;对于二维或更高维度的数组,你可以通过指定 axis 参数来计算沿某个轴的平均值。

import numpy as np  
  
# 创建一个一维数组  
arr1 = np.array([1, 2, 3, 4, 5])  
print("一维数组的平均值:", arr1.mean())  
  
# 创建一个二维数组  
arr2 = np.array([[1, 2, 3],  
                 [4, 5, 6],  
                 [7, 8, 9]])  
  
# 计算整个二维数组的平均值(将所有元素视为一个一维数组)  
print("整个二维数组的平均值:", np.mean(arr2))  
  
# 沿着列(axis=0)计算平均值  
print("沿着列的平均值:", np.mean(arr2, axis=0))  
  
# 沿着行(axis=1)计算平均值  
print("沿着行的平均值:", np.mean(arr2, axis=1))


#一维数组的平均值: 3.0  
#整个二维数组的平均值: 5.0  
#沿着列的平均值: [4. 5. 6.]  
#沿着行的平均值: [2. 5. 8.]

12.5average()

        NumPy 提供了一个 numpy.average() 函数,它用于计算数组元素的加权平均值。与 mean() 函数不同,average() 函数允许你指定一个权重数组来计算加权平均值。

import numpy as np  
  
# 创建一个一维数组  
arr = np.array([1, 2, 3, 4, 5])  
  
# 计算整个数组的平均值(与 mean() 相同,因为没有指定权重)  
avg_value = np.average(arr)  
print("整个数组的平均值:", avg_value)  
  
# 创建一个权重数组  
weights = np.array([0.1, 0.2, 0.3, 0.4, 0.0])  
  
# 计算加权平均值  
weighted_avg_value = np.average(arr, weights=weights)  
print("加权平均值:", weighted_avg_value)

#整个数组的平均值: 3.0  
#加权平均值: 2.6

12.6var()

    在 NumPy 中,计算方差时使用的是统计学中的方差公式,而不是概率论中的方差公式,主要是因为 NumPy 的设计目标是处理实际数据集,而不是概率分布。np.var 函数默认计算的是总体方差(Population Variance),而不是样本方差(Sample Variance)。

import numpy as np  
  
data = np.array([1, 2, 3, 4, 5])  
  
# 计算方差,默认计算样本方差(ddof=1)  
variance = np.var(data)  
print("方差:", variance)  
  
# 如果要计算总体方差,可以设置 ddof=0  
population_variance = np.var(data, ddof=0)  
print("总体方差:", population_variance)

12.7std()

        标准差是方差的算术平方根,用来描述一组数据平均值的分散程度。若一组数据的标准差较大,说明大部分的数值和其平均值之间差异较大;若标准差较小,则代表这组数值比较接近平均值

import numpy as np  
  
data = np.array([1, 2, 3, 4, 5])  
  
# 计算标准差,默认计算样本标准差(ddof=1)  
std_dev = np.std(data)  
print("标准差:", std_dev)  
  
# 如果要计算总体标准差,可以设置 ddof=0  
population_std_dev = np.std(data, ddof=0)  
print("总体标准差:", population_std_dev)

http://www.kler.cn/news/362160.html

相关文章:

  • matlab怎样自动搜索文件夹中的所有txt文件,并将每个txt文件中的数据存放到一个cell数组中——MATLAB批量处理数据
  • JavaScript 中怎么判断前端各种运行环境
  • 【图像去噪】论文精读:CycleISP: Real Image Restoration via Improved Data Synthesis
  • 后台管理员登录实现--系统篇
  • 听泉鉴宝在三个月前已布局商标注册!
  • 极狐GitLab 发布安全补丁版本 17.4.2, 17.3.5, 17.2.9
  • 6,000 个网站上的假 WordPress 插件提示用户安装恶意软件
  • 前端 js 处理一个数组 展示成层级下拉样式
  • 理解和解决TCP 网络编程中的粘包与拆包问题
  • 【C++】创建TCP服务端
  • DLNA—— 开启智能生活多媒体共享新时代
  • 线性可分支持向量机的原理推导 9-23拉格朗日乘子α的最大化问题 公式解析
  • Spring中导致事务传播失效的情况(自调用、方法访问权限、异常处理不当、传播类型选择错误等。在实际开发中,务必确保事务方法正确配置)
  • 回溯法求解简单组合优化问题
  • 初学者怎么入门大语言模型(LLM)?
  • 微积分复习笔记 Calculus Volume 1 - 3.5 Derivatives of Trigonometric Functions
  • 11.学生成绩管理系统(Java项目基于SpringBoot + Vue)
  • rk3568 , rk3588, rtl8211F , 时钟的问题
  • MySQL--mysql的安装
  • 什么是CI/CD
  • 主机本地IP与公网IP以及虚拟机的适配器和WSL发行版的IP
  • 分布式异步任务框架Celery,如何实现代码实时监控
  • 聊聊黑龙江等保测评
  • 人大金仓链接
  • rancher安装并快速部署k8s 管理集群工具
  • C/S 软件架构