numpy基础使用

197 阅读2分钟

一、numpy创建

import random
import numpy as np

1.使用np.array()创建

arr = np.array([1,3,5,7,9])
print(arr)
[1 3 5 7 9]

2.使用plt创建

可以将外部的一张图片加载到Numpy数组中,然后可以进行裁剪、旋转等操作

import matplotlib.pyplot as plt
img_arr = plt.imread("D://1570951326128.jpg")  #返回的是数组,数组中装载的是图片内容
plt.imshow(img_arr)  #将numpy数组进行可视化展示
<matplotlib.image.AxesImage at 0x2ec9e644d60>

图片.png

3.使用np的函数创建

arr_1 = np.zeros(shape=(4,3))
arr_2 = np.ones(shape=(4,3))
arr_3 = np.linspace(0,10,num=5)
arr_4 = np.arange(10,20,step=2)
arr_5 = np.random.randint(0,50,size=(4,3))
print(arr_1,'\n\n',arr_2,'\n\n',arr_3,'\n\n',arr_4,'\n\n',arr_5)
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]] 

 [[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]] 

 [ 0.   2.5  5.   7.5 10. ] 

 [10 12 14 16 18] 

 [[27 49 35]
 [18 44 39]
 [19 37 38]
 [23 43 21]]

二、数组和列表的区别

  • 数组中存储的数据元素类型必须是统一的类型

  • 数组中的元素类型有优先级:字符串>浮点数>整数

arr_case=np.array([1,2,'three'])
arr_case.dtype
dtype('<U11')

三、Numpy的常用属性

arr_case=np.random.randint(10,100,size=(5,4))
arr_case
array([[89, 51, 27, 82],
       [32, 87, 66, 72],
       [24, 17, 72, 79],
       [71, 73, 64, 52],
       [15, 85, 47, 72]])
arr_case.shape  #返回数组的形状
(5, 4)
arr_case.ndim  #返回数组的维度
2
arr_case.size  #返回数组元素的个数
20
arr_case.dtype  #返回数组的类型
dtype('int32')

四、Numpy的数据类型

  • array(dtype=x):可以设定数据类型

  • arr.dtype = 'x':可以修改数据类型

  • astype可以显式地转换数组的类型

arr_case=np.random.randint(10,100,size=(5,4),dtype='int32')
arr_case.dtype
dtype('int32')
arr_case.dtype='int64'
arr_case.dtype
dtype('int64')
arr_case=np.random.randint(10,100,size=(5,4),dtype='int32')
arr = arr_case.astype(np.int64)
arr.dtype
dtype('int64')

五、Numpy的索引和切片操作

arr = np.random.randint(10,100,size=(5,4),dtype='int32')
arr
array([[70, 97, 84, 52],
       [39, 76, 88, 49],
       [45, 15, 89, 23],
       [51, 86, 73, 81],
       [33, 38, 17, 86]])
arr[0]  #取数组的第一行数据,数组的索引从0开始
array([70, 97, 84, 52])
arr[0:2]  #取数组的第一行到第二行数据
array([[70, 97, 84, 52],
       [39, 76, 88, 49]])
arr[[0,2]]  #取数组的第一行和第三行数据,注意是两个列表框
array([[70, 97, 84, 52],
       [45, 15, 89, 23]])
arr[0,0]  #取数组的第一行,第一列的数据
70
arr[0,[1,2]]  #取数组的第一行,第二列和第三列的数据
array([97, 84])
arr[:,[1,2]]  #取数组的二列和第三列的数据
array([[97, 84],
       [76, 88],
       [15, 89],
       [86, 73],
       [38, 17]])
arr[:,0:3]  #取数组的一列到第三列的数据
array([[70, 97, 84],
       [39, 76, 88],
       [45, 15, 89],
       [51, 86, 73],
       [33, 38, 17]])
arr[0:2,0:2]  #取数组的前两行前两列的数据
array([[70, 97],
       [39, 76]])
arr[::-1]  #取数组的行顺序进行倒转
array([[33, 38, 17, 86],
       [51, 86, 73, 81],
       [45, 15, 89, 23],
       [39, 76, 88, 49],
       [70, 97, 84, 52]])
arr[:,::-1]  #取数组的列顺序进行倒转
array([[52, 84, 97, 70],
       [49, 88, 76, 39],
       [23, 89, 15, 45],
       [81, 73, 86, 51],
       [86, 17, 38, 33]])
arr[[1,2],[1,2]]  #相当于arr[1,1]、arr[2,2]
array([76, 89])

六、关于图片数组的维度

img_arr = plt.imread("d:\\1570951326128.jpg")
img_arr.ndim
3
img_arr.shape
(640, 360, 3)

七、Numpy数组形状变形

  • reshape是返回一个新的数组对象,并不会改变原数组的内容

  • resize也可以改变数组的形状,只不过resize会直接将原数组进行改变

  • ravel将数组按照一定的方式降为一维数组,并不会改变原数组的内容

arr = np.random.randint(1,50,size=(5,3))
arr
array([[ 5, 49, 18],
       [ 6, 26, 42],
       [33,  4,  7],
       [21, 13, 11],
       [37, 13, 19]])
arr_1 = arr.reshape(15,)  #将二维数组降为一维
arr_1
array([ 5, 49, 18,  6, 26, 42, 33,  4,  7, 21, 13, 11, 37, 13, 19])
arr_2 = arr.reshape(3,5)  #将 5行3列 改为 3行5列
arr_2
array([[ 5, 49, 18,  6, 26],
       [42, 33,  4,  7, 21],
       [13, 11, 37, 13, 19]])
arr_3 = arr.reshape(3,-1)  #行或列只要有同一个数字确定,python会自动计算-1位置上的数字,前提是那个确定的数字能被原数组中的元素个数整除
arr_3  
array([[ 5, 49, 18,  6, 26],
       [42, 33,  4,  7, 21],
       [13, 11, 37, 13, 19]])
arr_4 = arr.ravel()   #将原数组按照行的方向降为一维数组,不会改变原数组的形状
arr_4
array([ 5, 49, 18,  6, 26, 42, 33,  4,  7, 21, 13, 11, 37, 13, 19])
arr_5 = arr.ravel(order='F')   #将原数组按照列的方向降为一维数组,不会改变原数组的形状
arr_5
array([ 5,  6, 33, 21, 37, 49, 26,  4, 13, 13, 18, 42,  7, 11, 19])
arr.resize(3,5)  #resize也可以改变数组的形状,只不过resize会直接将原数组进行改变
arr
array([[ 5, 49, 18,  6, 26],
       [42, 33,  4,  7, 21],
       [13, 11, 37, 13, 19]])

八、排序函数、np.inld函数、unique去重函数、np.where函数

排序函数、np.inld函数、unique去重函数、np.where函数

1、 sort()函数

arr = np.random.randint(1,50,size=(5,3))
arr
array([[35, 43, 43],
       [45, 25, 47],
       [10, 43, 27],
       [20, 42, 37],
       [31, 45, 34]])
arr.sort()   #直接改变的是原数组,如果是多维数组,那么默认axis=1
arr
array([[35, 43, 43],
       [25, 45, 47],
       [10, 27, 43],
       [20, 37, 42],
       [31, 34, 45]])
arr = np.random.randint(1,50,size=(5,3))
arr

array([[16, 47, 15],
       [10, 12, 29],
       [ 6, 33, 44],
       [34, 38, 26],
       [ 2, 14, 31]])
arr.sort(0)   #直接改变的是原数组,按照数组中的列排序
arr
array([[ 2, 12, 15],
       [ 6, 14, 26],
       [10, 33, 29],
       [16, 38, 31],
       [34, 47, 44]])

arr.sort()都是从小到大进行排序的,如果想让从大到小进行排序,可以在排序之后使用切片操作达到目的

注意 arr.sort() 对应的是 arr[ : , : : -1 ]、arr.sort(0)对应的是arr[ : : -1 ]

arr[::-1] #在arr.sort()执行之后进行切片操作
array([[34, 47, 44],
       [16, 38, 31],
       [10, 33, 29],
       [ 6, 14, 26],
       [ 2, 12, 15]])

2、 argsort()函数

argsort返回的是从小到大的索引值,索引值从0开始

arr = np.random.randint(1,50,size=(5,3))
arr
array([[49, 45, 33],
       [22, 48, 31],
       [27, 27, 23],
       [36, 42, 12],
       [25,  2, 47]])
arr.argsort(0) #返回新的数组对象,不改变原数组,0表示按照列的方向
array([[1, 4, 3],
       [4, 2, 2],
       [2, 3, 1],
       [3, 0, 0],
       [0, 1, 4]], dtype=int64)

3、np.in1d()函数

注意是in“一”d,你是in“L”d

arr = np.random.randint(1,50,size=(5,3))
list_case=[12,5,4,8]
arr
array([[45,  4, 49],
       [23, 17, 25],
       [18, 42, 26],
       [11, 16, 32],
       [26, 24, 11]])
np.in1d(arr,list_case)  #判断arr里的元素是否在list_case中,返回一个布尔值的数组
array([False,  True, False, False, False, False, False, False, False,
       False, False, False, False, False, False])

发现返回的结果是一个一维数组,不方便于我i们查看,我们此时可以将一维数组转化为与arr相同形状的数组

np.in1d(arr,list_case).reshape(5,3)
array([[False,  True, False],
       [False, False, False],
       [False, False, False],
       [False, False, False],
       [False, False, False]])

4、unique()去重函数

arr_1 = np.array([[1,3,4,5,7,9],[2,4,5,7,9,7],[1,3,4,5,8,9]])
arr_1
array([[1, 3, 4, 5, 7, 9],
       [2, 4, 5, 7, 9, 7],
       [1, 3, 4, 5, 8, 9]])
np.unique(arr_1) #计算arr_1的唯一值并排序
array([1, 2, 3, 4, 5, 7, 8, 9])

5、np.where函数

5.1. np.where(condition, x, y)

满足条件condition,输出x,不满足输出y

arr = np.array(np.random.randint(1,20,size=(5,6)))
arr
array([[16,  4, 13, 10, 11,  5],
       [19,  1,  2,  7, 19, 14],
       [ 9,  4,  9,  2, 14, 16],
       [ 9,  5,  4, 13,  3,  6],
       [18, 17, 18,  7, 14, 18]])
np.where(arr[0:3]>15,'大于','小于') #arr的前三行的数据如果大于15,返回大于,否则返回小于
array([['大于', '小于', '小于', '小于', '小于', '小于'],
       ['大于', '小于', '小于', '小于', '大于', '小于'],
       ['小于', '小于', '小于', '小于', '小于', '大于']], dtype='<U2')

5.2. np.where(condition)

只有条件 (condition),没有x和y,则输出满足条件元素的索引 (等价于numpy.nonzero)

这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。

arr = np.array(np.random.randint(1,20,size=(5,6)))
arr
array([[ 6, 11, 17, 15, 14, 13],
       [ 6, 16,  5,  6, 11, 16],
       [15,  7, 11, 16,  9,  1],
       [16, 13, 11,  6,  2, 16],
       [19, 12, 14,  9, 14, 13]])
np.where(arr>15)  #结果的第一行表示行索引,第二行表示列索引
(array([0, 1, 1, 2, 3, 3, 4], dtype=int64),
 array([2, 1, 5, 3, 0, 5, 0], dtype=int64))

九、矩阵相关

numpy.eye(x) 函数返回给定大小的单位矩阵

arr_1 = np.eye(5)
arr_1
array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])
arr_1.T   #矩阵的转置,行变成列,列变成行
array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])

矩阵相乘: numpy.dot(a, b, out=None)

a 、 b 为两个数组

arr1 = np.random.randint(1,10,size=[4,3])
arr1
array([[3, 8, 2],
       [6, 4, 7],
       [1, 8, 6],
       [7, 9, 9]])
arr2 = arr1.T
arr2
array([[3, 6, 1, 7],
       [8, 4, 8, 9],
       [2, 7, 6, 9]])
np.dot(arr1,arr2)
array([[ 77,  64,  79, 111],
       [ 64, 101,  80, 141],
       [ 79,  80, 101, 133],
       [111, 141, 133, 211]])