6. 高级操作
① 连接数组(将两个数组拼接)
# 4.1 垂直和水平入栈
arr1 = np.ones((2,2))
arr2 = np.zeros((2,2))
arr1_v = np.vstack((arr1,arr2)) # 垂直入栈(栈垂直向下增长)
print(arr1_v)
arr1_h = np.hstack((arr1,arr2)) # 水平入栈(栈水平向右增长)
print(arr1_h)
'''
[[ 1. 1.]
[ 1. 1.]
[ 0. 0.]
[ 0. 0.]]
[[ 1. 1. 0. 0.]
[ 1. 1. 0. 0.]]
'''
# 4.2 将一维数组以行或列的方式压入栈中,形成二维结构
a = np.array([1,2,3])
b = np.array([4,5,6])
c_column = np.column_stack((a,b)) # 作为列拼接
print(c_column)
c_row = np.row_stack((a,b)) # 作为行拼接
print(c_row)
'''
[[1 4]
[2 5]
[3 6]]
[[1 2 3]
[4 5 6]]
'''
② 数组切分(将一个数组划分为多个部分)
arr1 = np.arange(16).reshape((4,4))
print(arr1)
arr1_h1,arr1_h2 = np.hsplit(arr1,2) # 按列切分
print(arr1_h1,'\n',arr1_h2)
arr1_v1,arr1_v2= np.vsplit(arr1,2) # 按行切分
print(arr1_v1,'\n',arr1_v2)
'''
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
按列切分
[[ 0 1]
[ 4 5]
[ 8 9]
[12 13]]
[[ 2 3]
[ 6 7]
[10 11]
[14 15]]
按行切分
[[0 1 2 3]
[4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]
'''
# 切分为3部分,中间部分为[1,3],即第二列和第三列,axis=1,按列切分
arr1_1,arr1_2,arr1_3= np.split(arr1,[1,3],axis=1)
print(arr1_1,'\n',arr1_2,'\n',arr1_3)
'''
切分为3部分,分别为0,1-2列,3列
[[ 0]
[ 4]
[ 8]
[12]]
[[ 1 2]
[ 5 6]
[ 9 10]
[13 14]]
[[ 3]
[ 7]
[11]
[15]]
'''
7. 对象的副本(视图)
# 5.1 不使用副本的情况下,修改原始数据所有数据都发生变化
arr1 = np.arange(4)
arr2 = arr1
print("原始的arr1:",arr1)
arr1[-1] = 5 # 修改数组最后一位
print("修改之后的arr1:",arr1)
print("此时的arr2:",arr2)
'''
原始的arr1: [0 1 2 3]
修改之后的arr1: [0 1 2 5]
此时的arr2: [0 1 2 5]
'''
# 5.2 使用副本
arr3 = arr1.copy()
print("arr1的副本数据arr3:",arr3)
arr1[-1] = 0
print("修改arr1的值:",arr1)
print("此时arr3的值",arr3)
'''
arr1的副本数据arr3: [0 1 2 5]
修改arr1的值: [0 1 2 0]
此时arr3的值 [0 1 2 5]
'''
8. 向量化(避免了多层的循环)
# 方便实现矩阵间的运算,避免了循环
# 矩阵向量化实现
arr1 = np.arange(4).reshape((2,2))
arr2 = np.arange(4).reshape((2,2))
mul = arr1*arr2
print(mul)
# 通常语言的实现方法
arr3 = np.ones((2,2))
for i in range(arr1.shape[0]):
for j in range(arr1.shape[1]):
arr3[i,j] = arr1[i,j]*arr2[i,j]
print(arr3)
'''
[[0 1]
[4 9]]
[[ 0. 1.]
[ 4. 9.]]
'''
9. 广播机制
规则:
一、为缺失的维度补上1(即用一个维度去填充多个维度)
二、如果存在值(一个数组对应位置存在值),都用已有值进行填充;
# 广播机制
arr1 = np.arange(8).reshape((2,4))
arr2 = np.arange(4)
arr_add = arr1+arr2
print("arr1:",arr1)
print("arr2:",arr2)
print("add:",arr_add)
'''
arr1: [[0 1 2 3]
[4 5 6 7]]
arr2: [0 1 2 3]
add: [[ 0 2 4 6]
[ 4 6 8 10]]
'''
10. 文件操作
a.数据读取
函数使用:从txt文件中读取数据,必须保证数据为同一数据类型
基本形式:
参数说明:
fname:文件或其路径;
dtype结果数据类型;
comments:注释符号
delimiter:分隔符
converters:通过字典映射数据
skiprows:跳过的行号
usecols:需要获取的列号
unpack:是否压缩(若为TRUE,则对应列会分别显示,字段数据被拆分,不是一个整体)
ndmin:返回数组的最小维度
encoding:编码格式
b. 数据写入
函数说明:保存数组数据到txt文件
形式:
X:一维或二维数组 fmt:定义输出格式
newline:划分行标记
header:写在文件开始
footer:写在文件结束
# 其他参数同np.loadtxt()函数
特殊说明:np.loadtxt(),np.savetxt()函数除了使用txt文件,还可以实现对csv文件的操作;
data = np.loadtxt('data/data1.csv',delimiter=',')
print(data)
np.savetxt('data/data2.csv',data,delimiter=',',fmt='%1.2f')
'''
data1.csv
1,23
2,20
3,15
data2.csv
1.00,23.00
2.00,20.00
3.00,15.00
'''
参考:
1.https://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html
2.https://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html
3.《Python 数据分析实战》