Numpy入门

Numpy

1、概述

(一)、简介

  • NumPy(Numerical Python)是Python数据分析必不可少的第三方库
  • NumPy的出现一定程度上解决了Python运算性能不佳的问题,同时提供了更加精确的数据类型,使其具备了构造复杂数据类型的能力。
  • 本身是由C语言开发,是个很基础的扩展,NumPy被Python其它科学计算包作为基础包,因此理解np的数据类型对python数据分析十分重要。
  • NumPy重在数值计算,主要用于多维数组(矩阵)处理的库。用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多

(二)、功能

  • 高性能科学计算和数据分析的基础包

  • ndarray,多维数组,具有矢量运算能力,快速、节省空间

  • 矩阵运算,无需循环,可完成类似Matlab中的矢量运算

  • 用于读写磁盘数据的工具以及用于操作内存映射文件的工具

2、Numpy属性

(一)、常见属性

  • ndarray.ndim # 数组的维度

  • ndarray.shape # 数组的形状

  • ndarray.size # 所有元素的个数

  • ndarray.dtype # 元素的类型

  • ndarray.itemsize # 元素的大小

(二)、例子

# 1. 构建1个3行5列的 ndarray对象(n维数字), 即: 3行5列.
arr = np.arange(15).reshape((3, 5))  # arange(15)类似于Python的range(15),  然后把0~15(包左不包右)的数据放到 3个 长度维5的一维数组中.
print(f'ndarray对象: {arr}')  # ndarray对象.

print(f'数组的形状(维度): {arr.shape}')  # (3, 5), 简单理解为: 3行5列
print(f'数组的轴: {arr.ndim}')  # 2, 几维数组, 维度(轴)就是几.
print(f'数组的长度: {arr.size}')  # 15, 即所有元素的个数.
print(f'数组的每个元素的类型: {arr.dtype}')  # int64
print(f'数组的每个元素的大小(字节数): {arr.itemsize}')  # 8
print(f'数组的类型: {type(arr)}')  # <class 'numpy.ndarray'>

# 扩展: 上述的 shape, ndim, size等属性, 可以改写成: np.属性名(对象对)的形式. 
print(f'数组的形状(维度): {np.shape(arr)}')  # (3, 5), 简单理解为: 3行5列
print(f'数组的轴: {np.ndim(arr)}')  # 2, 几维数组, 维度(轴)就是几.
print(f'数组的长度: {np.size(arr)}')  # 15, 即所有元素的个数.
# print(f'数组的每个元素的类型: {np.dtype(arr)}')  # 报错, 无该函数
# print(f'数组的每个元素的大小(字节数): {np.itemsize(arr)}')  # 报错, 无该函数
# print(f'数组的类型: {np.type(arr)}')          # 报错, 无该函数

3、ndarray对象

(一)、数组的方式创建

格式

# 细节: 数组的元素类型要统一
array()  

例如

# 1. 数组方式创建 ndarray对象(Numpy的核心对象, 即: n维数组)
arr1 = np.array([1, 2, 3])
print(f'arr的内容: {arr1}')
print(f'arr的类型: {type(arr1)}')
print(f'arr的元素类型: {arr1.dtype}')  # int32
'''
arr的内容: [1 2 3]
arr的类型: <class 'numpy.ndarray'>
arr的元素类型: int32
'''


# 2. 数组方式创建 ndarray对象(Numpy的核心对象, 即: n维数组)
arr2 = np.array([1.1, 2.3, 3.5])
print(f'arr2的内容: {arr2}')
print(f'arr2的类型: {type(arr2)}')
print(f'arr2的元素类型: {arr2.dtype}')  # float64
'''
arr2的内容: [1.1 2.3 3.5]
arr2的类型: <class 'numpy.ndarray'>
arr2的元素类型: float64
'''

(二)、创建空的ndarray对象

格式

# 细节: 3个函数, 获取的元素类型都是: float64
zero()      # 创造一个全是0的矩阵
ones()		# 创造一个全是1的矩阵
empty()		# 创造一个内容随机的矩阵(随机依赖于内存,内存不变随机数不变)

例如

# 1. 演示 zeros()函数, 创建1个全是0的ndarray对象.
arr3 = np.zeros((3, 5))  # 维度: 3行5列, 1个二维数组, 它有3个元素(每个都是1维数组), 且每个一维数组有5个元素.
print(f'arr3的内容: {arr3}')
print(f'arr3的类型: {type(arr3)}')
print(f'arr3的元素类型: {arr3.dtype}')  # float64
'''
arr3的内容: [[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
arr3的类型: <class 'numpy.ndarray'>
arr3的元素类型: float64
'''


# 2. 演示 ones()函数, 创建1个 全是1的 ndarray对象.
arr4 = np.ones((2, 3))  # 维度: 2行3列, 1个二维数组, 它有2个元素(每个都是1维数组), 且每个一维数组有3个元素.
print(f'arr4的内容: {arr4}')
print(f'arr4的类型: {type(arr4)}')
print(f'arr4的元素类型: {arr4.dtype}')  # float64
'''
arr4的内容: [[1. 1. 1.]
 [1. 1. 1.]]
arr4的类型: <class 'numpy.ndarray'>
arr4的元素类型: float64
'''


# 3. 演示 empty()函数, 创建1个 内容随机且依赖内存状态的 ndarray对象.
arr5 = np.empty((2, 3))  # 维度: 2行3列, 1个二维数组, 它有2个元素(每个都是1维数组), 且每个一维数组有3个元素.
print(f'arr5的内容: {arr5}')
print(f'arr5的类型: {type(arr5)}')
print(f'arr5的元素类型: {arr5.dtype}')  # float64
'''
arr5的内容: [[1. 1. 1.]
 [1. 1. 1.]]
arr5的类型: <class 'numpy.ndarray'>
arr5的元素类型: float64
'''

(三)、创建指定范围和步长的ndarray对象

格式

arange()  # 类似于python中的range()函数

例如

# 参1: 起始值(start), 参2: 结束值(不包括) stop,  参3: 步长, step.  参4: 数据类型, dtype
arr6 = np.arange(0, 10, 2, dtype=np.int64)
print(f'arr6的内容: {arr6}')
print(f'arr6的类型: {type(arr6)}')
print(f'arr6的元素类型: {arr6.dtype}')  # float64
'''
arr6的内容: [0 2 4 6 8]
arr6的类型: <class 'numpy.ndarray'>
arr6的元素类型: int64
'''

(四)、创建二维数组

格式

matrix()    # 创建二维的数组,mat()与该函数效果一致

例如

# 1. 创建2维矩阵.
# arr7 = np.mat('1 2 3;4 5 6')
arr7 = np.matrix('1 2 3;4 5 6')
print(f'arr7的内容: {arr7}')
print(f'arr7的类型: {type(arr7)}')  # matrix类型是 ndarray类型的 子类型.
print(f'arr7的元素类型: {arr7.dtype}')  # float64
'''
arr7的内容: [[1 2 3]
 [4 5 6]]
arr7的类型: <class 'numpy.matrix'>
arr7的元素类型: int32
'''


# 2. 创建2维矩阵.
arr8 = np.mat('1,2,3;4,5,6')
print(f'arr8的内容: {arr8}')
print(f'arr8的类型: {type(arr8)}')  # matrix类型是 ndarray类型的 子类型.
print(f'arr8的元素类型: {arr8.dtype}')  # float64
'''
arr8的内容: [[1 2 3]
 [4 5 6]]
arr8的类型: <class 'numpy.matrix'>
arr8的元素类型: int32
'''


# 3. 创建2维矩阵.
arr9 = np.mat(([1, 2, 3], [4, 5, 6]))  # (第1个1维数组, 第2个一维数组...)
print(f'arr9的内容: {arr9}')
print(f'arr9的类型: {type(arr9)}')  # matrix类型是 ndarray类型的 子类型.
print(f'arr9的元素类型: {arr9.dtype}')  # float64
'''
arr9的内容: [[1 2 3]
 [4 5 6]]
arr9的类型: <class 'numpy.matrix'>
arr9的元素类型: int32
'''

(五)、创建随机的ndarray对象

格式

random.rand()       # 创建0.0~1.0之间的随机数
random.randint()	# 指定范围内生成整数随机数
random.uniform()	# 指定范围内生成小数随机数

例如

# 1. random.rand()函数, 创建0.0 ~ 1.0区间的随机数.
arr10 = np.random.rand(3, 5)  # 3行5列
print(f'arr10的内容: {arr10}')
print(f'arr10的类型: {type(arr10)}')  # <class 'numpy.ndarray'>
print(f'arr10的元素类型: {arr10.dtype}')  # float64
'''
arr10的内容: [[0.53813533 0.44168178 0.1511361  0.77878695 0.78863361]
 [0.05959302 0.72917081 0.37366742 0.50864748 0.72221538]
 [0.81312235 0.80706018 0.34945499 0.21080258 0.64437881]]
arr10的类型: <class 'numpy.ndarray'>
arr10的元素类型: float64
'''


# 2. random.randint()函数, 可以指定范围, 生成: 整数的随机数
arr11 = np.random.randint(1, 10, size=(3, 5))  # 3行5列
print(f'arr11的内容: {arr11}')
print(f'arr11的类型: {type(arr11)}')  # <class 'numpy.ndarray'>
print(f'arr11的元素类型: {arr11.dtype}')  # float64
'''
arr11的内容: [[8 9 5 2 6]
 [1 7 4 4 3]
 [4 4 9 5 5]]
arr11的类型: <class 'numpy.ndarray'>
arr11的元素类型: int32
'''


# 3. random.uniform()函数, 可以指定范围, 生成: 小数的随机数
arr12 = np.random.uniform(1, 10, size=(3, 5))  # 3行5列
print(f'arr12的内容: {arr12}')
print(f'arr12的类型: {type(arr12)}')  # <class 'numpy.ndarray'>
print(f'arr12的元素类型: {arr12.dtype}')  # float64
'''
arr12的内容: [[2.84314753 5.22655245 6.17191338 9.47401406 4.99604169]
 [2.56853946 5.87402435 5.00552884 3.89829494 4.66979043]
 [2.2194954  5.81720869 1.90185452 7.55161239 7.3594193 ]]
arr12的类型: <class 'numpy.ndarray'>
arr12的元素类型: float64
'''

(六)、ndarray的类型转换

格式

astype()    # 可以将ndarray转换成目标类型

例如

# 1. 创建1个 ndarray对象, 元素类型为: float64
arr13 = np.zeros((3, 5), dtype=np.float64)
print(arr13)
print(arr13.dtype)  # float64
'''
[[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
float64
'''
# 2. 把上述的 arr13 从 float64 => int32
arr14 = arr13.astype(np.int32)
print(arr14)
print(arr14.dtype)  # int32
'''
[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
int32
'''

(七)、等比和等差数列

格式

logspace()		# 等比数列
linspace()		# 等差数列

例如

# 1. logspace(): 等比数列, 默认是: 10的幂, 且: 包左包右
arr15 = np.logspace(1, 3, 5)  # 生成10 ^ 1 ~ 10 ^ 3之间, 5个元素
print(f'arr15的内容: {arr15}')
print(f'arr15的类型: {type(arr15)}')  # <class 'numpy.ndarray'>
print(f'arr15的元素类型: {arr15.dtype}')  # float64
'''
arr15的内容: [  10.           31.6227766   100.          316.22776602 1000.        ]
arr15的类型: <class 'numpy.ndarray'>
arr15的元素类型: float64
'''


# 2. logspace(): 等比数列, 默认是: 10的幂, 且: 包左包右, 指定底数.
arr15 = np.logspace(1, 3, 5, base=2)  # 生成2 ^ 1 ~ 2 ^ 3之间, 5个元素
print(f'arr15的内容: {arr15}')
print(f'arr15的类型: {type(arr15)}')  # <class 'numpy.ndarray'>
print(f'arr15的元素类型: {arr15.dtype}')  # float64
'''
arr15的内容: [2.         2.82842712 4.         5.65685425 8.        ]
arr15的类型: <class 'numpy.ndarray'>
arr15的元素类型: float64
'''


# 3. linspace(): 等差数列, 默认: 包左包右.
arr16 = np.linspace(1, 10, 5)  # 1 ~ 10之间的, 5个元素.
print(f'arr16的内容: {arr16}')
print(f'arr16的类型: {type(arr16)}')  # <class 'numpy.ndarray'>
print(f'arr16的元素类型: {arr16.dtype}')  # float64
'''
arr16的内容: [ 1.    3.25  5.5   7.75 10.  ]
arr16的类型: <class 'numpy.ndarray'>
arr16的元素类型: float64
'''


# 4. linspace(): 等差数列, 默认: 包左包右.    endpoint: 默认是True(即: 包括结束值)
arr17 = np.linspace(1, 10, 5, endpoint=False)  # 1 ~ 10之间的, 5个元素.
print(f'arr17的内容: {arr17}')
print(f'arr17的类型: {type(arr17)}')  # <class 'numpy.ndarray'>
print(f'arr17的元素类型: {arr17.dtype}')  # float64
'''
arr17的内容: [1.  2.8 4.6 6.4 8.2]
arr17的类型: <class 'numpy.ndarray'>
arr17的元素类型: float64
'''

4、函数

(一)、基本函数

格式

np.ceil()		# 向上最接近的整数,参数是 number 或 array
np.floor()		# 向下最接近的整数,参数是 number 或 array
np.rint()		# 四舍五入,参数是 number 或 array
np.isnan()		# 判断元素是否为 NaN(Not a Number),参数是 number 或 array
np.multiply()	# 元素相乘,参数是 number 或 array
np.divide()		# 元素相除,参数是 number 或 array
np.abs()		# 元素的绝对值,参数是 number 或 array
np.where(condition, x, y)	# 三元运算符,x if condition else y
# 注意: 需要注意multiply/divide 如果是两个ndarray进行运算 shape必须一致

例如

# 1. 创建1个正太分布的 ndarray对象.
arr = np.random.randn(2, 3)
'''
-0.344227,-0.766068,1.536094
-0.153168,-0.029010,-0.351011
'''

# 2. 演示基本函数.
print(np.ceil(arr))  # 向上取整, 天花板数.
print(np.floor(arr))  # 向下取整, 地板数.
print(np.rint(arr))  # 四舍五入
print(np.isnan(arr))  # 判断是否是: 空值.
print(np.abs(arr))  # 绝对值
print(np.multiply(arr, arr))  # 乘法运算. 
print(np.divide(arr, arr))  # 除法运算. 
print(np.where(arr > 0, 1, -1))  # 转换, 大于0的 => 1, 否则 => -1
'''
[[-0. -0.  2.]
 [-0. -0. -0.]]
[[-1. -1.  1.]
 [-1. -1. -1.]]
[[-0. -1.  2.]
 [-0. -0. -0.]]
[[False False False]
 [False False False]]
[[0.34422725 0.76606825 1.53609391]
 [0.15316788 0.0290104  0.35101139]]
[[1.18492401e-01 5.86860558e-01 2.35958451e+00]
 [2.34604003e-02 8.41603241e-04 1.23208996e-01]]
[[1. 1. 1.]
 [1. 1. 1.]]
[[-1 -1  1]
 [-1 -1 -1]]
'''

(二)、统计函数

格式

sum()		# 求矩阵和
cumsum()	# 前缀和,输出列表

例如

# 1. 创建1个 ndarray对象.
arr = np.arange(12).reshape(3, 4)  # 3行4列, 二维数组
'''
0,1,2,3
4,5,6,7
8,9,10,11
'''
# 2. 统计函数
print(np.sum(arr))  # 求和: 66
print(np.cumsum(arr))  # 求和: [ 0  1  3  6 10 15 21 28 36 45 55 66]
'''
66
[ 0  1  3  6 10 15 21 28 36 45 55 66]
'''
# 3. 按行或者列进行求和, axis=0 或者 1     0 => 按列计算,  1 => 按行计算
print(np.sum(arr, axis=0))  # [12 15 18 21]
print(np.sum(arr, axis=1))  # [ 6 22 38]
'''
[12 15 18 21]
[ 6 22 38]
'''

(三)、判断相关

格式

any()		# 任意1个值满足条件即可, 类似于Python中的 or
all()		# 要求所有的元素都要满足, 类似于Python的and

例如

# 1. 创建1个 ndarray对象.
arr = np.random.randn(2, 3)
'''
1.297382,0.299214,0.995814
0.973208,-1.486949,-0.408149
'''

# 2. 演示 any()函数: 任意1个值满足条件即可, 类似于Python中的 or
print(np.any(arr > 0))  # True

# 3. 演示 all()函数: 要求所有的元素都要满足, 类似于Python的and
print(np.all(arr > 0))  # False

(四)、去重相关

格式

unique()		# 去重

去重

# 1. 创建1个 ndarray对象.
arr = np.array([[3, 2, 1, 2], [2, 6, 5, 5]])

# 2. 对上述的 ndarry去重
print(np.unique(arr))  # [1 2 3 5 6]

(五)、排序相关

格式

sort(容器)		# 返回1个新的ndarray对象
容器.sort()		# 对自身进行排序

去重

# 1. 创建1个 ndarray对象.
arr = np.array([3, 1, 2, 5, 6])
print(f'排序前: {arr}')


# 2. 排序, 方式1: np.sort(arr) => 返回1个新的ndarray对象.
# np.sort(arr)
# print(f'排序后: {arr}')

new_arr = np.sort(arr)
print(f'排序后: {new_arr}')


# 3. 排序, 方式2: arr.sort() => 对自身进行排序.
arr.sort()
print(f'排序后: {arr}')

5、运算

(一)、基本运算

格式

+, -

例如

# 1. 创建两个 ndarray对象.
arr1 = np.array([10, 20, 30, 40])
arr2 = np.arange(4)

# 2. 打印上述的两个对象.
print(f'arr1: {arr1}')
print(f'arr2: {arr2}')

# 3. 基本运算, 并输出结果.
arr3 = arr1 - arr2
print(f'arr3: {arr3}')      # [10 19 28 37]

(二)、矩阵运算

格式

multiply()		# 哈达玛积(元素积),对应位置上的元素乘
dot()			# 乘积,行乘列后的和,为当前元素

例如

# 1. 创建两个 ndarray对象.
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(f'arr1: {arr1}')
print(f'arr2: {arr2}')

# 2. 矩阵运算, 场景1: A的行数 = B的行数  且 A的列数 = B的列数
# arr3 = arr1 * arr2
arr3 = np.multiply(arr1, arr2)
print(f'arr3: {arr3}')      # [[ 1  4  9], [16 25 36]]


# 3. 矩阵运算, 场景2: A的列数 = B的行数  且 A的列数 != B的列数
# 假设: A => 2行3列,    B => 3行2列  

# 3.1 创建两个ndarray对象.
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[1, 2], [4, 5], [-6, 7]])

print(f'arr1: {arr1}')
print(f'arr2: {arr2}')

# 3.3 矩阵运算.
print(np.dot(arr1, arr2))
print(arr1.dot(arr2))       # [[-9, 33], [-12, 75]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值