1 Numpy简易入门
1.1 认识Numpy数组对象
1.1.1 np.arange
In [1]:
import numpy as np
#创建3行4列的数组
data = np.arange(12).reshape(3,4)
data
Out[1]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [2]:
#arange
np.arange(1, 20, 5)#[1,20)间隔5
Out[2]:
array([ 1, 6, 11, 16])
1.1.2 类型
In [3]:
type(data)
Out[3]:
numpy.ndarray
1.1.3 数组维度个数
In [4]:
data.ndim
Out[4]:
2
1.1.4 数组的维度
In [5]:
data.shape
Out[5]:
(3, 4)
1.1.5 数组元素的个数
In [6]:
data.size
Out[6]:
12
1.1.6 数据元素的类型
In [7]:
data.dtype
Out[7]:
dtype('int32')
1.2 创建Numpy数组
1.2.1 创建数组
In [8]:
#创建一维数组
data1 = np.array([1,2,3])
data1
Out[8]:
array([1, 2, 3])
In [9]:
#创建二维数组
data2 = np.array([[1,2,3],[4,5,6]])
data2
Out[9]:
array([[1, 2, 3],
[4, 5, 6]])
1.2.2 特殊数组
In [10]:
#全0数组
np.zeros((3,4))
Out[10]:
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
In [11]:
#全1数组
np.ones((3,4))
Out[11]:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
In [12]:
#全空数组 每个数字接近0
np.empty((3,4))
Out[12]:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
In [13]:
#浮点数数组
np.ones((2,3), float)
Out[13]:
array([[1., 1., 1.],
[1., 1., 1.]])
1.3 ndarry对象的数据类型
1.3.1 查看数据类型
In [14]:
data_one = np.array([[1,2,3],[4,5,6]])
data_one.dtype.name
Out[14]:
'int32'
1.3.2 转换数据类型
In [15]:
data = np.array([[1,2,3],[4,5,6]])
data.dtype
Out[15]:
dtype('int32')
In [16]:
float_data = data.astype(np.float64)
float_data.dtype
Out[16]:
dtype('float64')
In [17]:
float_data = np.array([1.2,2.3,3.5])
float_data
Out[17]:
array([1.2, 2.3, 3.5])
In [18]:
int_data = float_data.astype(np.int64)
int_data
Out[18]:
array([1, 2, 3], dtype=int64)
In [19]:
str_data = np.array(['1','2','3'])
int_data = str_data.astype(np.int64)
int_data
Out[19]:
array([1, 2, 3], dtype=int64)
1.4 数组运算
1.4.1 向量化运算
In [20]:
data1 = np.array([[1,2,3],[4,5,6]])
data2 = np.array([[1,2,3],[4,5,6]])
data1 + data2
Out[20]:
array([[ 2, 4, 6],
[ 8, 10, 12]])
In [21]:
data1 * data2
Out[21]:
array([[ 1, 4, 9],
[16, 25, 36]])
In [22]:
data1 - data2
Out[22]:
array([[0, 0, 0],
[0, 0, 0]])
In [23]:
data1 / data2
Out[23]:
array([[1., 1., 1.],
[1., 1., 1.]])
1.4.2 数组广播
numpy数组的基础运算要求一对一,即a.shape==b.shape
如果两者不相同,自动触发广播机制
In [24]:
arr1 = np.array([[0], [10], [20], [30]])
arr1.shape
Out[24]:
(4, 1)
In [25]:
arr2 = np.array([0, 1, 2])
arr2.shape
Out[25]:
(3,)
In [26]:
arr1 + arr2
Out[26]:
array([[ 0, 1, 2],
[10, 11, 12],
[20, 21, 22],
[30, 31, 32]])
1.4.3 数组与标量的运算
In [27]:
data1 = np.array([[1,2,3],[4,5,6]])
data2 = 10
In [28]:
data1+data2
Out[28]:
array([[11, 12, 13],
[14, 15, 16]])
In [29]:
data1 * data2
Out[29]:
array([[10, 20, 30],
[40, 50, 60]])
In [30]:
data1 - data2
Out[30]:
array([[-9, -8, -7],
[-6, -5, -4]])
In [31]:
data1 / data2
Out[31]:
array([[0.1, 0.2, 0.3],
[0.4, 0.5, 0.6]])
1.5 ndarray的索引和切片
In [32]:
arr = np.arange(8)
arr
Out[32]:
array([0, 1, 2, 3, 4, 5, 6, 7])
In [33]:
arr[5]
Out[33]:
5
In [34]:
arr[3:5]
Out[34]:
array([3, 4])
In [35]:
arr[1:6:2]
Out[35]:
array([1, 3, 5])
In [36]:
arr2d = np.arange(1,10).reshape(3,3)
arr2d
Out[36]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
In [37]:
arr2d[1]
Out[37]:
array([4, 5, 6])
In [38]:
arr2d[:2]
Out[38]:
array([[1, 2, 3],
[4, 5, 6]])
In [39]:
arr2d[0:2, 0:2]
Out[39]:
array([[1, 2],
[4, 5]])
In [40]:
arr2d[1, :2]
Out[40]:
array([4, 5])
1.5.2 花式索引
In [41]:
demo_arr = np.empty((4,4))
for i in range(4):
demo_arr[i] = np.arange(i, i + 4)
demo_arr
Out[41]:
array([[0., 1., 2., 3.],
[1., 2., 3., 4.],
[2., 3., 4., 5.],
[3., 4., 5., 6.]])
In [42]:
#获取第0行,第2行
demo_arr[[0, 2]]
Out[42]:
array([[0., 1., 2., 3.],
[2., 3., 4., 5.]])
In [43]:
#获取元素(1,1) (3,2)
demo_arr[[1,3], [1,2]]
Out[43]:
array([2., 5.])
1.5.3 布尔型
In [44]:
student_name = np.array(["Tom", "Lily", "Jack", "Rose"])
student_score = np.array([[79, 88, 80],[89, 90, 92],[83, 78, 85],[78,76,80]])
In [45]:
#进行==判断,生成布尔型数组
student_name == 'Jack'
Out[45]:
array([False, False, True, False])
In [46]:
#返回数据是True对应的行
student_score[student_name == 'Jack']
Out[46]:
array([[83, 78, 85]])
In [47]:
student_score[student_name == 'Jack', :1]
Out[47]:
array([[83]])
1.6 数组的转置与轴对称
In [48]:
arr = np.arange(12).reshape((3,4))
arr
Out[48]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [49]:
#使用T属性进行转置
arr.T
Out[49]:
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
In [50]:
#使用transpose函数进行转置
#默认维度是行和列,用0,1表示,传入参数1,0表示交换行和列
arr.transpose(1,0)
Out[50]:
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
In [51]:
arr_3d = np.arange(16).reshape((2,2,4))
arr_3d
Out[51]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
In [52]:
#使用transpose函数进行转置
#默认维度是0,1,2表示,现在变成1,2,0 对应维度进行变换 变成2*4*2
arr_3d.transpose(1,2,0)
Out[52]:
array([[[ 0, 8],
[ 1, 9],
[ 2, 10],
[ 3, 11]],
[[ 4, 12],
[ 5, 13],
[ 6, 14],
[ 7, 15]]])
In [53]:
#利用swapaxes函数 参数x,y 交换维度x,y
arr_3d.swapaxes(1,0)
Out[53]:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
1.7 NumPy通用函数
In [54]:
arr = np.array([4,9,16])
In [55]:
#开方
np.sqrt(arr)
Out[55]:
array([2., 3., 4.])
In [56]:
#绝对值
np.abs(arr)
Out[56]:
array([ 4, 9, 16])
In [57]:
#平方
np.square(arr)
Out[57]:
array([ 16, 81, 256], dtype=int32)
In [58]:
#数组相加
x = np.array([1,5,4,6])
y = np.array([2,7,3,8])
np.add(x, y)
Out[58]:
array([ 3, 12, 7, 14])
In [59]:
#数组相减
np.subtract(x,y)
Out[59]:
array([-1, -2, 1, -2])
In [60]:
#数组相乘
np.multiply(x,y)
Out[60]:
array([ 2, 35, 12, 48])
In [61]:
#数组相除
np.divide(x,y)
Out[61]:
array([0.5 , 0.71428571, 1.33333333, 0.75 ])
In [62]:
#取最大值
np.maximum(x,y)
Out[62]:
array([2, 7, 4, 8])
In [63]:
np.greater(x,y)
Out[63]:
array([False, False, True, False])
1.8 利用NumPy数组进行数据处理
1.8.1 将条件逻辑转为数组运算
In [64]:
#np.where(bool, x, y) 为true则选择x,否则选择y
arr_x = np.array([1,5,7])
arr_y = np.array([2,6,8])
arr_con = np.array([True, False, True])
result = np.where(arr_con, arr_x, arr_y)
result
Out[64]:
array([1, 6, 7])
In [65]:
x = np.array([[1,0],[2,-2],[-2,1]])
np.where(x>0,x,0)
Out[65]:
array([[1, 0],
[2, 0],
[0, 1]])
In [66]:
np.where(x>0)#返回满足条件的索引,这里是二维数组所以索引是两个维度
Out[66]:
(array([0, 1, 2], dtype=int64), array([0, 0, 1], dtype=int64))
In [67]:
#x,y不存在时,返回为True的索引
np.where(arr_x > 3)
Out[67]:
(array([1, 2], dtype=int64),)
1.8.2 数组统计运算
In [68]:
arr = np.arange(10)
In [69]:
#求和
arr.sum()
Out[69]:
45
In [70]:
#平均值
arr.mean()
Out[70]:
4.5
In [71]:
#最大值
arr.max()
Out[71]:
9
In [72]:
#最小值
arr.min()
Out[72]:
0
In [73]:
#最大值索引
arr.argmax()
Out[73]:
9
In [74]:
#最小值索引
arr.argmin()
Out[74]:
0
In [75]:
#前缀和
arr.cumsum()
Out[75]:
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45], dtype=int32)
In [76]:
#前缀积
arr.cumprod()
Out[76]:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)
In [77]:
arr = np.arange(12).reshape((3,4))
arr
Out[77]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [78]:
arr.sum(axis = 0)
#axis=0 表示除第0维度外,其他维度相同的进行相加
#即a[0][0]+a[1][0]+a[2][0]=12
#即一列相加
Out[78]:
array([12, 15, 18, 21])
In [79]:
arr.sum(axis = 1)
#axis=0 表示除第1维度外,其他维度相同的进行相加
#即a[0][0]+a[0][1]+a[0][2]+a[0][3] = 6
#即一列相加
Out[79]:
array([ 6, 22, 38])
In [80]:
np.diff(arr, axis = 1)
#差分
Out[80]:
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
In [81]:
np.diff(arr, axis = 0)
#差分
Out[81]:
array([[4, 4, 4, 4],
[4, 4, 4, 4]])
In [82]:
np.floor([-0.6, -1.4, -0.1, -1.8, 0, 1.4, 1.7])
#向下取整
Out[82]:
array([-1., -2., -1., -2., 0., 1., 1.])
In [83]:
np.ceil([-0.6, -1.4, -0.1, -1.8, 0, 1.4, 1.7])
#向上取整
Out[83]:
array([-0., -1., -0., -1., 0., 2., 2.])
1.8.3 数组排序
In [84]:
arr = np.array([[6,2,7], [3,6,2], [4,3,2]])
print(arr)
arr.sort()#默认:axis = 1 每一行排列
arr
Out[84]:
[[6 2 7]
[3 6 2]
[4 3 2]]
array([[2, 6, 7],
[2, 3, 6],
[2, 3, 4]])
In [85]:
arr = np.array([[6,2,7], [3,6,2], [4,3,2]])
print(arr)
arr.sort(axis = 0)
arr
Out[85]:
[[6 2 7]
[3 6 2]
[4 3 2]]
array([[3, 2, 2],
[4, 3, 2],
[6, 6, 7]])
1.8.4 检查数组元素
In [86]:
arr = np.array([[1,-2,-7], [-3,6,2], [-4,3,2]])
arr
Out[86]:
array([[ 1, -2, -7],
[-3, 6, 2],
[-4, 3, 2]])
In [87]:
#arr所有中,是否有一个大于0
np.any(arr>0)
Out[87]:
True
In [88]:
#arr所有元素是否都大于0
np.all(arr>0)
Out[88]:
False
1.8.5 唯一化及其他集合逻辑
In [89]:
arr = np.array([12,11,34,23,12,8,11])
#去重排序
np.unique(arr)
Out[89]:
array([ 8, 11, 12, 23, 34])
In [90]:
#检查ndarray中的元素是否等于[11,12]中的一个,返回bool数组
np.in1d(arr, [11,12])
Out[90]:
array([ True, True, False, False, True, False, True])
1.9 线性代数模块
In [91]:
arr_x = np.array([[1,2,3],[4,5,6]])
arr_y = np.array([[1,2],[3,4],[5,6]])
#矩阵乘法
np.dot(arr_x, arr_y)
Out[91]:
array([[22, 28],
[49, 64]])
In [92]:
arr_x = np.array([1,2,3])
arr_y = np.array([4,5,6])
#相邻内积
np.dot(arr_x, arr_y)
Out[92]:
32
1.10 随机数模块
In [93]:
#生成3*3二维数组 随机数满足标准正态分布
np.random.rand(3,3)
Out[93]:
array([[0.84605074, 0.82890355, 0.87727491],
[0.15867545, 0.59406993, 0.32397337],
[0.32959366, 0.44147691, 0.08369832]])
In [94]:
#生成2*3*3三维数组
np.random.rand(2,3,3)
Out[94]:
array([[[0.60817751, 0.38764354, 0.7409757 ],
[0.04089362, 0.24936102, 0.97661135],
[0.25285954, 0.04942331, 0.97362796]],
[[0.15259705, 0.97900768, 0.90175511],
[0.17868536, 0.50850353, 0.34824289],
[0.73240194, 0.96398491, 0.22104247]]])
In [95]:
#随机数种子 zhongz
np.random.seed(0)
In [96]:
np.random.rand(5)
Out[96]:
array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])
In [97]:
#种子相同 数字相同
np.random.seed(0)
np.random.rand(5)
Out[97]:
array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])