NumPy ndarray 基础教程

227 阅读5分钟

NumPy 是 Python 中用于科学计算的基础库之一,它提供了强大的多维数组对象 ndarray,以及丰富的数学函数库。本文将介绍如何创建、操作和处理 ndarray,并总结常用的 NumPy 功能。

创建 ndarray

从列表创建 ndarray

使用 np.array 函数可以将 Python 列表转换为 NumPy 数组。

import numpy as np
my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)

查看 ndarray 的属性

你可以使用以下属性来查看 NumPy 数组的详细信息:

print("元素类型 dtype:", my_arr.dtype)  # 数据类型
print("维度数 ndim:", my_arr.ndim)  # 数组的维度数
print("数组大小 size:", my_arr.size)  # 数组中元素的总数
print("各维度大小 shape:", my_arr.shape)  # 数组的形状(各维度的大小)
print("元素占用的存储空间 itemsize:", my_arr.itemsize)  # 每个元素占用的字节数

创建二维 ndarray

你可以创建多维数组,例如二维数组:

my_arr_2d = np.array([[1, 2], [3, 4]])

修改维度

使用 reshape 方法可以生成一个新的数组,改变其形状。使用 shape 属性可以直接修改原数组的形状。

# 生成新的数组
reshaped_arr = my_arr.reshape(2, 3)
# 改变原数组
my_arr.shape = (2, 3)

复原和拍平

使用 ravel 方法可以将数组复原为一维数组。使用 flatten 方法可以将多维数组拍平为一维数组。

# 复原
flattened_arr = my_arr.ravel()
# 拍平
flattened_arr = my_arr.flatten()

组合和拆分

使用 vstackhstack 方法可以将多个数组组合在一起。使用 hsplitvsplit 方法可以将数组拆分。

# 组合
vstacked_arr = np.vstack((my_arr_2d, my_arr_2d))
hstacked_arr = np.hstack((my_arr_2d, my_arr_2d))

# 拆分
hsplit_arr = np.hsplit(my_arr_2d, 2)
vsplit_arr = np.vsplit(my_arr_2d, 2)

创建函数

NumPy 提供了多种创建数组的函数:

# arange
arr = np.arange(0, 12, 3)  # [0 3 6 9]

# linspace
arr = np.linspace(0, 10, 5)  # [ 0. 2.5 5. 7.5 10. ]

# zeros
arr = np.zeros(6)  # [0. 0. 0. 0. 0. 0.]

# ones
arr = np.ones(6)  # [1. 1. 1. 1. 1. 1.]

# random
arr = np.random.random(3)  # [0.68390055 0.50917134 0.91393462]

运算

广播

广播机制允许 NumPy 在不同形状的数组之间进行算术运算。

arr = np.array([1, 2])
result = arr * 6  # [6, 12]

一维数组运算

NumPy 支持对一维数组进行各种算术运算。

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
result = arr1 + arr2  # [5, 7, 9]

二维数组运算

NumPy 支持对二维数组进行各种算术运算。

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
result = A + B  # [[ 6  8]
                #  [10 12]]

# 点乘
result = np.dot(A, B)

常用函数

NumPy 提供了许多常用的数学函数:

arr = np.array([1, 2, 3, 4])

# 各值的平方根
sqrt_arr = np.sqrt(arr)

# 各元素以 e 为底的对数
log_arr = np.log(arr)

# 各元素正弦值
sin_arr = np.sin(arr)

# 各个元素的和
sum_arr = np.sum(arr)

# 最小值、最大值、平均值、标准差
min_val = np.min(arr)
max_val = np.max(arr)
mean_val = np.mean(arr)
std_val = np.std(arr)

# 各个元素的累计和
cumsum_arr = np.cumsum(arr)  # [ 1  3  6 10]

# 各个元素的累计积
cumprod_arr = np.cumprod(arr)

索引和切片

NumPy 数组支持多种索引和切片操作:

arr = np.array([0.1, 0.99, 2.5, 3.7])

# 索引
print(arr[1])  # 0.99
print(arr[[1, 2]])  # [0.99 2.5]

# 布尔索引
print(arr[arr < 1])  # [0.1  0.99]

# 切片
print(arr[1:3])  # [0.99 2.5]
print(arr[::2])  # [0.1 2.5]

读写

NumPy 提供了方便的读写数组的方法:

# 写
np.save('my_arr', my_arr)

# 读
loaded_arr = np.load('my_arr.npy')

# 写入多个数组
np.savez('array_archive.npz', my_arr1=my_arr, my_arr2=my_arr_2d)

# 压缩写入
np.savez_compressed('arrays_compressed.npz', my_arr1=my_arr, my_arr2=my_arr_2d)

复制

NumPy 提供了多种复制数组的方法:

# 直接赋值,存的相同地址
A = B

# 视图
A = B.view()

# 拷贝
A = B.copy()

总结

本文介绍了 NumPy 中 ndarray 的基础知识,包括创建、运算、常用函数、索引和切片、读写和复制等内容。通过这些操作,你可以高效地处理多维数组数据,进行科学计算和数据分析。希望这篇文章对你有所帮助!


原稿备注

创建

import numpy as np
my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)
元素类型 dtype  my_arr.dtype
维度数 ndim     my_arr.ndim
数组大小 size   my_arr.size
各维度大小 shape my_arr.shape
元素占用的存储空间  itemsize
二维:
修改维度 reshape my_arr.reshape(2,2)//生成新的  arr.shape(2,2)//改原数组 
复原 ravel 使用arr.shape修改的数组可以用revel复原
二维数组拍平 flatten和nditer my_arr.flatten()  np.nditer(my_arr, order='C') C行优先 F列优先
组合 row_stack/vstack竖向组合,列数相等  column_stack/hstack横向组合,行数相等
拆分 np.hsplit(arr,2)竖向拆分  np.vsplit(arr,2)横向拆分  np.split(arr,[起始,结束,跨度],axis=1)

创建函数:
arange np.atange(0,12,3) //[0 3 6 9] ,(起始值,结束值(不包含),步长)
linspace  np.linspace(0, 10, 5) //[ 0. 2.5 5. 7.5 10. ],(起始值,结束值(包含),分割数)
zeros  np.zeros(6) //[0. 0. 0. 0. 0. 0.],填充0
np.ones(6) //[1. 1. 1. 1. 1. 1.]
np.random.random(3)//[0.68390055 0.50917134 0.91393462]

运算

广播:    arr=[1,2]  arr*6等于[6,12]
一维数组: arr1+arr2=[同位相加],- * % \ //都是这样
二维数组: 基础运算,同位,且维度相同
         点成dot  np.dot(A,B)  A 的列数column === 矩阵 B 的行数row 

函数

各值的平方根 sqrt  np.sqrt(arr)
各元素以 e 为底的对数 log
各元素正弦值  sin
各个元素的和  sum
最小min 最大max  平均值mean 标准差std  
各个元素的累计和 cumsum  np.cumsum([1,2,3,4]) //[ 1 3 6 10]
各个元素的累计积 cumprod
二维数组:函数(arr,axis=index)//第二个参数是axis指定每列计算,得到一个一维数组

索引

arr[]
arr[[1,2]]多值索引
arr[1,2]二位数组索引
arr<1 [True False]返回布尔值
arr[arr<1] [0.1 0.99]区间索引 ,如果是二维数组会返回为符合条件的一维数组

切片
[起始下标:结束下标(不包含):跨度,二维数组的索引条件同上]

读写

写 np.save('my_arr1', my_arr1)
读 my_arr1 = np.load('my_arr1.npy')
写入多个 np.savez('array_archive.npz', my_arr1 = my_arr1, my_arr2 = my_arr2)
压缩写入 np.savez_compressed('arrays_compressed.npz', my_arr1 = my_arr1, my_arr2 = my_arr2)

复制

A=B 存的相同地址
A=B.view() A是B的视图  A.base is B   ,A的形状发生改变时,B 的形状并不会发生改变。
但是,当 A 的数据发生改变时,B 会发生同样的改变。
A=B.copy() 拷贝