Python常用库之numpy(二)

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 数据分析实战》

你可能感兴趣的:(python)