Numpy学习笔记01-摘自PaddlePaddle

https://www.paddlepaddle.org.cn/tutorials/projectdetail/3493088
1.7.1 ndarray数组
ndarray数组中所有元素的数据类型相同、数据地址连续,批量操作数组元素时速度更快。而list列表中元素的数据类型可能不同,需要通过寻址方式找到下一个元素。
ndarray数组支持广播机制,矩阵运算时不需要写for循环。
NumPy底层使用C语言编写,内置并行计算功能,运行速度高于Python代码。
案例1:显现a+1的计换

# Python原生的list
# 假设有两个list
a = [1, 2, 3, 4, 5]
b = [2, 3, 4, 5, 6]

# 完成如下计算
# 对a的每个元素 + 1
# a = a + 1 不能这么写,会报错
# a[:] = a[:] + 1 也不能这么写,也会报错
for i in range(5):
    a[i] = a[i] + 1
#使用nparray
import numpy as np
a = np.array([1,2,3,4,5])
a = a + 1
print(type(a))
print(a)
import numpy as np
a = [1,2,3,4,5,6]
b = np.array(a)
# 创建元素从0到10依次递增2的数组。start,stop,interval
a = np.arange(0,10,2)
# zeros:创建指定长度或者形状的全0数组。
a = np.zeros([3,3])
# 输出结果为
# [[0. 0. 0.][0. 0. 0.][0. 0. 0.]]
# 创建全1的ndarray
a = np.ones([3,3])
# 输出结果为:<class 'numpy.ndarray'> [[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]]
# 查看ndarray数组的属性:
# shape:数组的形状 ndarray.shape,1维数组,2维数组,3维数组
# dtype:数组的数据类型
# size:数组中的元素个数ndarry.size,其大小等于各个维度长度的成绩
# ndim:数组维度大小 ndaary.ndim,其大小等于ndarray.shape所包含的个数。
a = np.ones([3,3])
#print('a,dtype:{},shape:{},size:{}.ndim:{}'.format(a.dtype,a.shape,a.size,a.ndim))
# a,dtype:float64,shape:(3, 3),size:9.ndim:2
# print(type(a))
# print(a)
# 1.7.1.4
b = np.random.rand(10,10) # 随机创建10*10的矩阵
# 转换数据类型
b = a.astype(np.int64)
# print('b,dtype:{},shape:{},size:{},ndim:{}'.format(b.dtype, b.shape, b.size, b.ndim))
# 输出结果为:b,dtype:int64,shape:(3, 3),size:9,ndim:2
# 改变形状
c = a.reshape([1,9])
# print('c,dtype:{},shape:{},size:{},ndim:{}'.format(c.dtype, c.shape, c.size, c.ndim))
# 输出结果为:c,dtype:float64,shape:(1, 9),size:9,ndim:2
# 1.7.1.5 ndarray数组的基本运算(1)标量和ndarray数组之间的运算(2)两个ndarray数组之间的运算
# (1)标量和ndarray数组之间的运算
arr = np.array([[1.,2.,3.],[4.,5.,6.]])
# print(1./arr)
# 输出为:[[1.         0.5        0.33333333] [0.25       0.2        0.16666667]]

# 标量乘以数组,用标量乘以数组的每一个元素
arr = np.array([[1.,2.,3.],[4.,5.,6.]])
# print(2.0 * arr)
# [[ 2.  4.  6.] [ 8. 10. 12.]]
# 标量加上数组,用标量加上数组的每一个元素
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
arr = 2.0 + arr
# 标量减去数组,用标量减去数组的每一个元素
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
arr = 2.0 - arr

# (2)两个ndarray数组之间的运算
# 两个ndarray数组之间的运算主要包括减法、加法、乘法、除法和开根号运算,代码实现如下:
# 数组 减去 数组, 用对应位置的元素相减
arr1 = np.array([[1.,2.,3.],[4.,5.,6.]])
arr2 = np.array([[11., 12., 13.], [21., 22., 23.]])
# print(arr1 - arr2)
# [[-10. -10. -10.] [-17. -17. -17.]]
# 数组 加上 数组, 用对应位置的元素相加
arr1 = np.array([[1., 2., 3.], [4., 5., 6.]])
arr2 = np.array([[11., 12., 13.], [21., 22., 23.]])
# print(arr1 + arr2)
# [[12. 14. 16.] [25. 27. 29.]]
# 数组 乘以 数组,用对应位置的元素相乘
# print(arr1 * arr2)
# [[ 11.  24.  39.] [ 84. 110. 138.]]
# 数组 除以 数组,用对应位置的元素相除
#print(arr1 / arr2)
# [[0.09090909 0.16666667 0.23076923] [0.19047619 0.22727273 0.26086957]]
# 数组开根号,将每个位置的元素都开根号
# print(arr1 ** 0.5)
# 1.7.1.6 ndarray数组的索引和切片
# 在编写模型过程中,通常需要访问或者修改ndarray数组某个位置的元素,则需要使用ndarray数组的索引。有
# 些情况下可能需要访问或者修改一些区域的元素,则需要使用ndarray数组的切片。
# ndarray数组的索引和切片的使用方式与Python中的list类似。
# 通过[ -n , n-1 ]的下标进行索引,通过内置的slice函数,设置其start,stop和step参数进行切片,从原数组中切割出一个新数组。
# ndarray数组的索引是一个内容丰富的主题,因为选取数据子集或单个元素的方式有很多。
# 下面从一维数组和多维数组两个维度介绍索引和切片的方法。
# (1)1维ndarray数组的索引和切片
# 1维数组索引和切片
a = np.arange(30)
# [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# 24 25 26 27 28 29]
# 索引
a[10] # 10
b = a[4:7]   # [4 5 6]
a[4:7] = 10 # 切片处理
# 数组切片产生的新数组,还是指向原来的内存区域,数据不会被复制。
# 视图上的任何修改都会直接反映到源数组上。
a = np.arange(10)
arr_slice = a[4:7]
arr_slice[0] = 100
# print(a)
# print(arr_slice)
# [  0   1   2   3 100   5   6   7   8   9]
# [100   5   6]
# 通过copy给新数组创建不同的内存空间
a = np.arange(10)
arr_slice = a[4:7]
arr_slice = np.copy(arr_slice)  # 这时候就不会重复
arr_slice[0] = 100
# print(a)
# print(arr_slice)
# (2)多维 ndarray 数组的索引和切片
# 多维 ndarray 数组的索引和切片具有如下特点:
# 在多维数组中,各索引位置上的元素不再是标量而是多维数组。
# 以逗号隔开的索引列表来选取单个元素。
# 在多维数组中,如果省略了后面的索引,则返回对象会是一个维度低一点的ndarray。
# 创建一个多维数组
a = np.arange(30)
arr3d = a.reshape(5,3,2)
# (5, 3, 2) 意味着要把数组重塑成一个三维数组,此数组有 5个页,每一页是 3行2列的结构。
# print(arr3d)
# print(arr3d[0]) # [[0 1] [2 3] [4 5]]
# print(arr3d[0][0])    # [0 1]
# print(arr3d[0][1])    # [2 3]
# 创建一个数组
a = np.arange(24)
# reshape 成一个数组
a = a.reshape([6,4])
print(a)
# 1.7.1.7 ndarray数组的统计方法
# mean:计算算数平均数,零长度数组的mean为NaN
# std和var:计算标注差和方差,自由度可调
# sum :对数组中全部或某轴向的元素求和,零长度数组的sum为0。
# max和min:计算最大值和最小值。
# argmin和argmax:分别为最大和最小元素的索引。
# cumsum:计算所有元素的累加。
# cumprod:计算所有元素的累积。
# sum、mean以及标准差std等聚合计算既可以当做数组的实例方法调用,也可以当做NumPy函数使用。
# 计算均值,使用arr.mean() 或 np.mean(arr),二者是等价的
arr = np.array([[1,2,3], [4,5,6], [7,8,9]])
print(arr.mean(), np.mean(arr)) # 求平均值
print(arr.sum(),np.sum(arr))    # 求和
print(arr.max(),np.max(arr))    # 求最大值
print(arr.min(),np.min(arr))    # 求最小值
#指定计算的维度
posted @ 2025-06-02 17:24  长恨水长东  阅读(6)  评论(0)    收藏  举报