python - numpy基础(二)

一、numpy的基础操作

1、改变数组形状

(1).T 方法:转置,例如原来形状为(2,3)/(2,3,4)转置为(3,2)/(4,3,2),一维数组转置后不变。

a = np.arange(5)
print(a,‘\n‘,a.T)
b = np.ones((2,3))
print(b,‘\n‘,b.T)

#运行结果
[0 1 2 3 4] 
 [0 1 2 3 4]
[[ 1.  1.  1.]
 [ 1.  1.  1.]] 
 [[ 1.  1.]
 [ 1.  1.]
 [ 1.  1.]]

(2).reshape()方法:不改变数组元素,返回一个新的形状的数组,原数组不变

a = np.arange(10)
a1 = a.reshape((2,5))     #直接改变已有的数组
print(‘a = ‘,a)           #原数组不变
print(‘a1 = ‘,a1)
a2 = np.ones((4,6)).reshape((3,8))       #生成数组直接改变形状
print(‘a2 = ‘,a2)
a3 = np.reshape(a,(5,2))      #.reshape(a, newshape) 改变数组a的形状为newshape
print(‘a3 = ‘,a3)

#运行结果
a =  [0 1 2 3 4 5 6 7 8 9]
a1 =  [[0 1 2 3 4]
 [5 6 7 8 9]]
a2 =  [[ 1.  1.  1.  1.  1.  1.  1.  1.]
 [ 1.  1.  1.  1.  1.  1.  1.  1.]
 [ 1.  1.  1.  1.  1.  1.  1.  1.]]
a3 =  [[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]

(3).resize()方法:与.reshape()类似,但会改变原数组

a = np.arange(10)
a.resize((2,5))
print(a)                #改变了原来的数组a

#运行结果
[[0 1 2 3 4]
 [5 6 7 8 9]]
a = np.arange(10)
a1 = np.resize(a,(2,5))         #这样就不会改变原数组a,而生成新的数组a1
print(a)
print(a1)

#运行结果
[0 1 2 3 4 5 6 7 8 9]
[[0 1 2 3 4]
 [5 6 7 8 9]]

(4).flatten()方法:对数组降维,返回一个一维数组,原数组不变

a = np.arange(9).reshape((3,3))
a1 = a.flatten()
print(a)
print(a1)

#运行结果
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[0 1 2 3 4 5 6 7 8]

2、转换数组类型:new_a = a.astype(new_type)

a = np.arange(5,dtype = np.int)
a1 = a.astype(np.float)
print(a1,a1.dtype)
print(a,a.dtype)       #说明生成了一个新数组,而原数组不变

#运行结果
[0 1 2 3 4]
[ 0.  1.  2.  3.  4.] float64
[0 1 2 3 4] int32

3、数组的合并分拆和堆叠

(1)数组的复制:.copy()方法,生成新数组,并完全拷贝数据,与原数组不关联

a = np.arange(5)
a1 = a
print(a1 is a)
a1[0] = 9       #a1和a指向同一个值,同时会发生改变
print(a1,a) 

#运行结果
True
[9 1 2 3 4] [9 1 2 3 4]
a = np.arange(5)
a1 = a.copy()
print(a1 is a)
a1[0] = 9       #a1和a是不同的,没有相关联
print(a1,a)

#运行结果
False
[9 1 2 3 4] [0 1 2 3 4]

 (2)数组的堆叠:.hstack()方法,水平方向堆叠数组;.vstack()方法,垂直方向堆叠数组;.stack()沿着某个轴堆叠数组。

a = np.arange(4)
b = np.arange(4,8)
c = np.hstack((a,b))            
d = np.vstack((a,b))
e = np.stack((a,b),axis = 1)     #axis是轴的参数
#a,b必须达到可以组合的形状,否则组合不了
print(a)
print(b)
print(c)
print(d)
print(e)

#运行结果
[0 1 2 3]
[4 5 6 7]
[0 1 2 3 4 5 6 7]
[[0 1 2 3]
 [4 5 6 7]]
[[0 4]
 [1 5]
 [2 6]
 [3 7]]

(3)数组拆分:.hslipt()方法,将数组按列拆分;.vslipt()方法,将数组按行拆分。两种方法输出的结果都为列表。

a = np.arange(16).reshape((4,4))
b = np.hsplit(a,2)
c = np.vsplit(a,2)
print(a)
print(b,type(b))
print(c,type(c))

#运行结果
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
[array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15]])] <class ‘list‘>
[array([[0, 1, 2, 3],
       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])] <class ‘list‘>

4、数组的简单运算

a = np.arange(9).reshape((3,3))
print(a)
print(a + 10)    #加法
print(a - 1)     #减法
print(a * 2)     #乘法
print(a / 2)     #除法
print(a ** 2)    #幂乘

#运行结果
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[10 11 12]
 [13 14 15]
 [16 17 18]]
[[-1  0  1]
 [ 2  3  4]
 [ 5  6  7]]
[[ 0  2  4]
 [ 6  8 10]
 [12 14 16]]
[[ 0.   0.5  1. ]
 [ 1.5  2.   2.5]
 [ 3.   3.5  4. ]]
[[ 0  1  4]
 [ 9 16 25]
 [36 49 64]]
a = np.arange(9).reshape((3,3))
print(a)
print(a.mean())    #平均值
print(a.max())     #最大值
print(a.min())     #最小值
print(a.std())     #标准差
print(a.var())     #方差
print(a.sum())     #求和
print(np.sum(a,axis = 0))     #求列的和
print(np.sum(a,axis = 1))     #求行的和
print(np.sort(np.array([1,4,3,5,8])))    #排序

#运行结果
[[0 1 2]
 [3 4 5]
 [6 7 8]]
4.0
8
0
2.58198889747
6.66666666667
36
[ 9 12 15]
[ 3 12 21]
[1 3 4 5 8]

二、numpy的索引和切片

1、基本的索引和切片

(1)一维数组

a = np.arange(10)
print(a)
print(a[1])
print(a[1:4])

#运行结果
[0 1 2 3 4 5 6 7 8 9]
1
[1 2 3]

(2)二维数组

a = np.arange(12).reshape((3,4))
print(a)
print(a[1])      #第二行
print(a[1][1])   #第二行、第二列的数
print(a[1:3])    #第二到第三行
print(a[2,2])    #第三行、第三列的数
print(a[:2,1:])  #从开始到第2行,从第二列到最后

#运行结果
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[4 5 6 7]
5
[[ 4  5  6  7]
 [ 8  9 10 11]]
10
[[1 2 3]
 [5 6 7]]

2、更改、复制索引和切片的值

(1)更改。把标量值付给索引或切片时会自动改变原数组。

a = np.arange(5)
print(a)
a[1] = 100
print(a)

#运行结果
[0 1 2 3 4]
[  0 100   2   3   4]

(2)复制。运用.copy()方法,可以防止变动原数组

a = np.arange(5)
b = a.copy()
b[1] = 100
print(a)
print(b)

#运行结果
[0 1 2 3 4]
[  0 100   2   3   4]

3、布尔型索引和切片(后面的pandas判断矩阵就源于此)

a = np.arange(12).reshape((3,4))
i = np.array([True,False,True])
j = np.array([True,True,False,False])
print(a)
print(a[i,:])
print(a[:,j])

#运行结果
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  1  2  3]
 [ 8  9 10 11]]
[[0 1]
 [4 5]
 [8 9]]

三、numpy的随机数

1、np.random.rand(d0,d1,d2,......),生成[0,1)之间的随机浮点数或浮点数组。

2、np.random.randn(d0,d1,d2,........),生成服从正态分布的随机浮点数或浮点数组。

3、np.random.randint(low,hight = None,size = None),生成整数或整数数组。当hight = None时,取[0,low);当hight有取值时,取[low,hight)

a = np.random.rand(2,2)
b = np.random.randn(2,2)
c1 = np.random.randint(4,size = (2,2))
c2 = np.random.randint(4,7,(2,2))
print(a)
print(b)
print(c1)
print(c2)

#运行结果
[[ 0.21427936  0.631128  ]
 [ 0.49085549  0.2944278 ]]
[[ 0.53414493 -1.03783047]
 [-0.81749571  0.62813289]]
[[2 0]
 [0 2]]
[[6 6]
 [4 5]]

 四、numpy数据的输入输出

1、存储读取数据(.npy文件)

import numpy as np
import os

a = np.random.rand(2,2)
print(a)
np.save(‘C:\\Users\\yjj\\Desktop\\arrayrand.npy‘, a)      #保存数据
a_load = np.load(‘C:\\Users\\yjj\\Desktop\\arrayrand.npy‘)    #读取数据
print(a_load)

#运行结果
[[ 0.45866251  0.92471296]
 [ 0.84243829  0.22875525]]
[[ 0.45866251  0.92471296]
 [ 0.84243829  0.22875525]]

2、存储读取数据(.txt文件)

与存储读取.npy文件的方法类似,只是用到的是np.savetxt()方法和np.loadtxt()方法。

相关推荐