Python numpy库学习第2天
续接第1天的内容
10.数组操作
10.1数组变维
4种函数:reshape,flat,flatten,ravel
函数名称 | 函数介绍 |
---|---|
reshape | 在不改变数组元素的条件下,修改数组的形状 |
flat属性 | 返回是一个迭代器,可以用 for 循环遍历其中的每一个元素 |
flatten | 以一维数组的形式返回一份数组的副本,对副本的操作不会影响到原数组 |
ravel | 返回一个连续的扁平数组(即展开的一维数组),与 flatten不同,它返回的是数组视图(修改视图会影响原数组) |
示例代码如下:
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(2,5)
print(arr1)
arr2 = arr1.flat
for i in arr2:
print(i,end=' ')
print( )
arr3 = arr1.flatten()
arr3[0]=100
print(arr3)
arr4 = arr1.ravel()
arr4[0]=100
print(arr4)
print(arr1)
#结果展示:
"""
[[ 1 2 3 4 5]
[ 6 7 8 9 10]]
1
2
3
4
5
6
7
8
9
10
[100 2 3 4 5 6 7 8 9 10]
[100 2 3 4 5 6 7 8 9 10]
[[100 2 3 4 5]
[ 6 7 8 9 10]]
"""
#结果展示:
"""
[[ 1 2 3 4 5]
[ 6 7 8 9 10]]
1
2
3
4
5
6
7
8
9
10
[100 2 3 4 5 6 7 8 9 10]
[100 2 3 4 5 6 7 8 9 10]
[[100 2 3 4 5]
[ 6 7 8 9 10]]
"""
对于flatten()和ravel(),可以设置order参数指定数组的展开顺序,
C'
:按行优先顺序展开(默认)。
'F'
:按列优先顺序展开。
'A'
:如果原数组是 Fortran 连续的,则按列优先顺序展开;否则按行优先顺序展开。
'K'
:按元素在内存中的顺序展开。
10.2 数组转置
函数名称 | 说明 |
---|---|
transpose | 将数组的维度值进行对换,比如二维数组维度(2,4)使用该方法后为(4,2) |
ndarray.T | 与 transpose 方法相同 |
示例代码如下:
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(2,5)
print(arr1)
print("---------------------------")
arr2 = arr1.T
print(arr2)
print("---------------------------")
arr3 = np.transpose(arr1)
print(arr3)
"""
[[ 1 2 3 4 5]
[ 6 7 8 9 10]]
---------------------------
[[ 1 6]
[ 2 7]
[ 3 8]
[ 4 9]
[ 5 10]]
---------------------------
[[ 1 6]
[ 2 7]
[ 3 8]
[ 4 9]
[ 5 10]]
"""
10.3 修改数组维度
多维数组(也称为 ndarray)的维度(或轴)是从外向内编号的。这意味着最外层的维度是轴0,然后是轴1,依此类推。
函数名称 | 参数 | 说明 |
---|---|---|
expand_dims(arr, axis) | arr:输入数组 axis:新轴插入的位置 | 在指定位置插入新的轴(相对于结果数组而言),从而扩展数组的维度 |
squeeze(arr, axis) | arr:输入数的组 axis:取值为整数或整数元组,用于指定需要删除的维度所在轴,指定的维度值必须为 1 ,否则将会报错,若为 None,则删除数组维度中所有为 1 的项 | 删除数组中维度为 1 的项 |
expand_dims()代码示例:
import numpy as np
arr1 = np.array([1,2,3])
print(arr1.shape)
arr2 = np.expand_dims(arr1, axis=0)
print(arr2)
print(arr2.shape)
arr3 = np.expand_dims(arr1, axis=1)
print(arr3)
print(arr3.shape)
"""
(3,)
[[1 2 3]]
(1, 3)
[[1]
[2]
[3]]
(3, 1)
"""
squeeze()代码示例,这里需要分情况以帮助理解squeeze():
import numpy as np
arr1 = np.array([[1,2,3],[4,5,6]]).reshape(1,6)
print(arr1.shape)
arr2 = np.squeeze(arr1, axis=0)
print(arr2)
print(arr2.shape)
arr3 = np.squeeze(arr1, axis=1)
print(arr3)
print(arr3.shape)
"""
File "E:\code\python-demo\Dec 25th\demo 1.py", line 9, in <module>
arr3 = np.squeeze(arr1, axis=1)
File "C:\Users\DELL\.conda\envs\python-basic\lib\site-packages\numpy\_core\fromnumeric.py", line 1632, in squeeze
return squeeze(axis=axis)
ValueError: cannot select an axis to squeeze out which has size not equal to one
(1, 6)
[1 2 3 4 5 6]
(6,)
"""
这里报错是因为squeeze函数要求axis指定的维度值必须为1,而列的维度值为6。
import numpy as np
arr1 = np.array([[1,2,3],[4,5,6]]).reshape(6,1)
print(arr1.shape)
arr2 = np.squeeze(arr1, axis=1)
print(arr2)
print(arr2.shape)
arr3 = np.squeeze(arr1, axis=0)
print(arr3)
print(arr3.shape)
"""
(6, 1)
[1 2 3 4 5 6]
(6,)
Traceback (most recent call last):
File "E:\code\python-demo\Dec 25th\demo 1.py", line 9, in <module>
arr3 = np.squeeze(arr1, axis=0)
File "C:\Users\DELL\.conda\envs\python-basic\lib\site-packages\numpy\_core\fromnumeric.py", line 1632, in squeeze
return squeeze(axis=axis)
ValueError: cannot select an axis to squeeze out which has size not equal to one
"""
这里报错同上,即arr1数组的行维度值为6,不能满足squeeze中axis=1的条件
10.4 连接数组
函数名称 | 参数 | 说明 |
---|---|---|
hstack(tup) | tup:可以是元组,列表,或者numpy数组,返回结果为numpy的数组 | 按水平顺序堆叠序列中数组(列方向) |
vstack(tup) | tup:可以是元组,列表,或者numpy数组,返回结果为numpy的数组 | 按垂直方向堆叠序列中数组(行方向) |
hstack函数要求堆叠的数组在水平方向(行)上具有相同的形状。如果行数不一致,hstack() 将无法执行,并会抛出 ValueError 异常。
vstack() 要求堆叠的数组在垂直方向(列)上具有相同的形状。如果列数不一致,将无法执行堆叠操作。
vstack() 和 hstack() 要求堆叠的数组在某些维度上具有相同的形状。如果维度不一致,将无法执行堆叠操作。
这里h指horizontal,v指vertical,我猜。
代码示例如下:
import numpy as np
arr1 = np.array([1,2,3]).reshape(1,3)
arr2 = np.array([1,2,3,4,5,6,7,8,9]).reshape(3,3)
arr3 = np.vstack((arr1,arr2))
print(arr3)
print("-----------------------------")
arr1 = np.array([1,2,3]).reshape(3,1)
arr2 = np.array([1,2,3,4,5,6,7,8,9]).reshape(3,3)
arr3 = np.hstack((arr1,arr2))
print(arr3)
"""
[[1 2 3]
[1 2 3]
[4 5 6]
[7 8 9]]
-----------------------------
[[1 1 2 3]
[2 4 5 6]
[3 7 8 9]]
"""
10.5 分割数组
函数名称 | 参数 | 说明 |
---|---|---|
hsplit(ary, indices_or_sections) | ary:原数组 indices_or_sections:按列分割的索引位置 | 将一个数组水平分割为多个子数组(按列) |
vsplit(ary, indices_or_sections) | ary:原数组 indices_or_sections:按行分割的索引位置 | 将一个数组垂直分割为多个子数组(按行) |
hsplit,取到每一行的部分内容
vsplit,取到每一列的部分内容
书上的代码示例:
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]])
print(arr)
# 使用 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列的子数组
"""
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
第一个子数组:
[[1]
[5]
[9]]
第二个子数组:
[[ 2 3]
[ 6 7]
[10 11]]
第三个子数组:
[[ 4]
[ 8]
[12]]
"""
10.6 矩阵运算
1.np.dot
是一个通用的点积函数,适用于多种维度的数组。
对于二维数组(矩阵),
np.dot
等价于矩阵乘法。对于一维数组(向量),
np.dot
计算的是向量的点积(内积)。
2.np.matmul
是专门用于矩阵乘法的函数,适用于二维及更高维度的数组。
mat指matrix(矩阵),mul指multiple(乘法)
代码示例:
import numpy as np
a = np.array([[1, 2],
[3, 4]])
b = np.array([[5, 6],
[7, 8]])
result = np.matmul(a, b)
print(result)
"""
[[19 22]
[43 50]]
"""
3.np.linalg.det
计算一个方阵(行数和列数相等的矩阵)的行列式。
det指determinant(行列式)
代码示例:
import numpy as np
arr1 = np.array([1, 0, 0, 4, 5, 0, 7, 8, 9]).reshape(3, 3)
print(arr1)
det_arr1 = np.linalg.det(arr1)
print(det_arr1)
"""
[[1 0 0]
[4 5 0]
[7 8 9]]
44.99999999999999
"""
结果为44.999……是由于浮点数运算的精度限制,计算结果可能会出现非常小的误差。
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
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([7,8,9]).reshape(1,3)
arr3 = np.append(arr1, arr2,axis=0)
print(arr3)
print("----------------------")
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([7,8,9,10]).reshape(2,2)
arr3 = np.append(arr1, arr2,axis=1)
print(arr3)
"""
[[1 2 3]
[4 5 6]
[7 8 9]]
----------------------
[[ 1 2 3 7 8]
[ 4 5 6 9 10]]
"""
11.3 insert
函数名称 | 参数 | 说明 |
---|---|---|
insert(arr, obj, values, axis) | arr:输入的数组 obj:表示索引值,在该索引值之前插入 values 值 values:要插入的值 axis:默认为 None,返回的是一维数组;当 axis =0 时,追加的值会被添加到行,而列数保持不变,若 axis=1 则与其恰好相反 | 沿规定的轴将元素值插入到指定的元素前 |
如果obj为-1,表示插入在倒数第一个元素之前,不是在最后一列。
代码示例:
import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([7,8,9]).reshape(1,3)
arr3 = np.insert(arr1,[0,-1] ,arr2,axis=0)
print(arr3)
print("----------------------")
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([7,8]).reshape(2,1)
arr3 = np.insert(arr1,[0,-1] ,arr2,axis=1)
print(arr3)
print("----------------------")
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([7,8]) #等同于np.array([7,8]).reshape(1,2)
arr3 = np.insert(arr1,[0,-1] ,arr2,axis=1)
print(arr3)
"""
[[7 8 9]
[1 2 3]
[7 8 9]
[4 5 6]]
----------------------
[[7 1 2 7 3]
[8 4 5 8 6]]
----------------------
[[7 1 2 8 3]
[7 4 5 8 6]]
"""
注意到:第二种写法和第三种写法的区别,写法2是直接让2*1的数组插入了arr1索引为0和-2的位置;写法3是让1*2的数组分列广播到对应索引的位置。
11.4 delete
函数名称 | 参数 | 说明 |
---|---|---|
delete(arr, obj, axis) | arr:输入的数组 obj:表示索引值,要删除数据的索引 axis:默认为 None,返回的是一维数组;当 axis =0 时,删除指定的行,若 axis=1 则与其恰好相反 | 删掉某个轴上的子数组,并返回删除后的新数组 |
一维数组:
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)
"""
[1 2 4 6]
"""
二维数组:
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,axis=None)
print('delete 后数组 axis=None:\n', array_two)
array_three = np.delete(array_one,1, axis=0)
print('delete 后数组 axis=0:\n', array_three)
array_three = np.delete(array_one, 1, axis=1)
print('delete 后数组 axis=1:\n', array_three)
delete_test()
"""
原数组:
[[0 1 2]
[3 4 5]]
delete 后数组 axis=None:
[0 2 3 4 5]
delete 后数组 axis=0:
[[0 1 2]]
delete 后数组 axis=1:
[[0 2]
[3 5]]
"""
11.5 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
# 创建一个一维数组
arr = np.array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4])
# 使用 np.unique 查找唯一元素及其计数
unique_elements, counts = np.unique(arr, return_counts=True)
print(unique_elements)
# 输出:
# [1 2 3 4]
print(counts)
# 输出:
# [3 3 3 4]
12.统计函数
12.1 amin() 和 amax()
计算数组沿指定轴的最小值与最大值,并以数组形式返回
对于二维数组来说,axis=1 表示沿着水平方向,axis=0 表示沿着垂直方向
'''
numpy.amin() 和 numpy.amax() 函数:
1、计算数组沿指定轴的最小值与最大值,并以数组形式返回
2、对于二维数组来说,axis=1 表示沿着水平方向,axis=0 表示沿着垂直方向
'''
import numpy as np
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, axis=1))
print('原数组水平方向最大值:\n', np.amax(array_one, axis=1))
print('原数组垂直方向最小值:\n', np.amin(array_one, axis=0))
print('原数组垂直方向最大值:\n', np.amax(array_one, axis=0))
amin_amax_test()
"""
原数组元素:
[[ 1 23 4 5 6]
[ 1 2 333 4 5]]
原数组水平方向最小值:
[1 1]
原数组水平方向最大值:
[ 23 333]
原数组垂直方向最小值:
[1 2 4 4 5]
原数组垂直方向最大值:
[ 1 23 333 5 6]
"""
水平方向是列与列之间的关系,垂直方向是行与行之间的关系
12.2 ptp()
计算数组元素中最值之差值,即最大值 – 最小值
对于二维数组来说,axis=1 表示沿着水平方向,axis=0 表示沿着垂直方向
import numpy as np
# 创建一个二维数组
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, axis=1)
# 使用 np.ptp 按列计算峰峰值
ptp_values_col = np.ptp(arr, axis=0)
print(ptp_values_row)
# 输出:
# [2 2]
print(ptp_values_col)
# 输出:
# [3 3 3]
12.3 median()
用于计算中位数,中位数是指将数组中的数据按从小到大的顺序排列后,位于中间位置的值。如果数组的长度是偶数,则中位数是中间两个数的平均值。
import numpy as np
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 使用 np.median 计算中位数
median_value = np.median(arr,axis=None)
print(median_value)
# 输出:
# 3.5
# 使用 np.median 按行计算中位数
median_values_row = np.median(arr, axis=1)
# 使用 np.median 按列计算中位数
median_values_col = np.median(arr, axis=0)
print(median_values_row)
# 输出:
# [2. 5.]
print(median_values_col)
# 输出:
# [2.5 3.5 4.5]
12.4 mean()
沿指定的轴,计算数组中元素的算术平均值(即元素之总和除以元素数量)
import numpy as np
# 创建一个一维数组
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, axis=1)
# 使用 np.mean 按列计算平均值
mean_values_col = np.mean(arr, axis=0)
print(mean_values_row)
# 输出:
# [2. 5.]
print(mean_values_col)
# 输出:
# [2.5 3.5 4.5]
12.5、average()
加权平均值是将数组中各数值乘以相应的权数,然后再对权重值求总和,最后以权重的总和除以总的单位数(即因子个数);根据在数组中给出的权重,计算数组元素的加权平均值。该函数可以接受一个轴参数 axis,如果未指定,则数组被展开为一维数组。
其中 xi是数组中的元素,wi是对应的权重。
如果所有元素的权重之和等于1,则表示为数学中的期望值。
import numpy as np
def np_average():
# 创建一个一维数组
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, weights=weights)
print(average_value)
# 输出:
# 3.2
np_average()
作者:X天地不仁