本章介绍python是数组库——numpy的使用。numpy数组对于表格的学习具有很重要的作用,特别是pandas,学好numpy,为pandas打好基础。
目录
(3)arr.T 或 arr.transpose() 二维数组转置
(5)np.maximum()、np.minimum() 同位数比较取值
1. 创建数组
(1)np.array()
array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0,like=None)
object:一个序列,可为列表或者元组。
dtype:numpy内部数据类型,可以把数据转换为整数或者浮点数,可以选择int,int32,int64,float,float32,float64等。
copy:复制object序列,默认为True。当object是数组时,复制副本就不会影响原数组。
order:创建数组的布局形式。
subok:默认为False。是否使用内部数组类型。
ndmin:指定数组的维度。
like:创建维度像xxx一样数组。
直接创建数组,可以键入列表、元组。用的最多的参数只有前两个。
import numpy as np
arr = np.array([1,2,3,4,5])
print(arr)
print(type(arr))
print(arr.dtype)
传入元组也可以,自己动手试试。数组在 "外观" 上的不同在于列表是用逗号隔开,而数组是用空格隔开;在本质上的不同在于数组是一组同类数据的组合(全是数字或者全是字符串),而列表可以为不同类别。
加入同时传入数字和字符串,那么该数组的格式数据类型为字符串。如:
arr = np.array([1,2,'大',4,5])
print(arr)
print(type(arr))
print(arr.dtype)
type()函数是python的内置函数,用于判断整个变量是什么数据类型;arr.dtype是numpy的函数,用于判断数组中的数据属于什么数据类型。
(2)np.arange()
arange(start, stop, step, dtype=None, *, like=None) 连续范围创建。
start:开始(包含)。
stop:结束(不包含)。
step:步长(间距)。
dtype:numpy内部数据类型。
like:创建维度像xxx一样数组。
arr = np.arange(1,9)
# arr = np.array([1,2,3,4,5,6,7,8,9]) # 一样
# arr = np.array(range(1,9)) # 一样
print(arr)
arr_2 = np.arange(1,9,2)
print(arr_2)
2. 创建多维数组
(1)创建二维数组
arr = np.array([[1,2,3,4],
[5,6,7,8]])
print(arr)
二维可以理解为一个平面,也可以理解为一个几行几列的表格。
(3)创建多维数组
arr = np.array([[[1,2,3,4],[5,6,7,8]],
[[10,11,12,13],[14,15,16,17]]])
print(arr)
该例子为创建三维数组,就是多个平面(二维)叠加嘛。
3. 创建特殊数组
(1)np.ones()
np.ones(shape, dtype=None, order='C', *, like=None) 创建一个shape形状的全是1的数组。
shape:形状,几行几列。
arr = np.ones([2,3])
print(arr)
如果想得到整数,可设置数组数据类型:
arr = np.ones([2,3],dtype='int32')
print(arr)
创建一个2行3列的1数组。
(2)np.zeros()
arr = np.zeros([2,3])
print(arr)
创建一个2行3列的零数组。
(3)np.full()
np.full(shape, fill_value, dtype=None, order='C', *, like=None) 创建一个shape形状的全是特定值的数组。
arr = np.full([2,3],520)
print(arr)
创建一个指定形状指定数值的数组。
(4)np.eye()
np.eye(N, k=0, dtype=<class 'float'>) 创建对角线为1,其余为0的数组。
N:数组的规模 形状 几行几列(行数=列数)
k:哪条边全是1?对角线上下方(+ -)第k条线全是1,其余全是0。
dtype:内部数据类型。
a = np.eye(N=3,k=0)
print(a)
print('-'*35)
b = np.eye(N=3,k=1)
print(b)
如图,N=3则3行3列;k=0则是对角线全是1,其余全是0;k=1则是对角线上方第k条线全是1,其余全是0;k=-1则是对角线下方第k条线全是1,其余全是0......
(5)np.diag()
np.diag(a, k=0) 生成对角线元素是a的数组。
a:可以是一个列表、元组等。
k:哪条边全是1?对角线上下方(+ -)第k条线的元素是a,其余全是0。
a = [1,2,3]
b = np.diag(a)
print(b)
再如 k=1 (对角线上方第1条线的元素是a,其余全是0):
a = (1,2,3)
b = np.diag(a,k=1)
print(b)
4. 数组模板创建数组
(1)np.ones_like()
np.ones_like(a, dtype=None, order='K', subok=True, shape=None) 以一个数组为模板,创建一个和它形状一样,值是1的数组。
arr = np.array([[1,2,3],[4,5,6]])
print(arr)
print('-'*70)
a = np.ones_like(arr)
print(a)
此案例以arr数组为模板,创建一个形状像arr的,数值全是one即1的数组。
(2)np.zeros_like()
np.zeros_like(a, dtype=None, order='K', subok=True, shape=None) 以一个数组为模板,创建一个和它形状一样,值是0的数组。
arr = np.array([[1,2,3],[4,5,6]])
print(arr)
print('-'*70)
a = np.zeros_like(arr)
print(a)
(3)np.full_like()
np.full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None) 以一个数组为模板,创建一个和它形状一样,值是指定数值的数组。
arr = np.array([[1,2,3],[4,5,6]])
print(arr)
print('-'*70)
a = np.full_like(arr,520)
print(a)
5. 数组的属性
arr.shape | 返回一个数组的形状,即几行几列。 |
arr.size | 返回一个数组中所有数据元素的数目。 |
arr.ndim | 返回数据是几维的。 |
arr = np.array([[[1,2,3,4],[5,6,7,8]],
[[10,11,12,13],[14,15,16,17]]])
print(arr)
print('-'*70)
print(arr.shape)
print(arr.size)
print(arr.ndim)
可见该三维数组是由2个平面,每个平面由2行,每行由4个元素组成的。元素总数是16个。是三维数组。
6. numpy中的 random随机库
(1)随机数生成
np.random.randint(low, high=None, size=None, dtype=int)
low:最小值(包括)。
high:最大值(不包括)。
size:数量,形状等
dtype:数据类型。
ran = np.random.randint(1,51,(2,3))
print(ran)
通过随机数创建一个2行3列的数组。numpy中的随机数有点在于可以设置数组的形状(几行几列等),而随机数库random一次只能得到一个。
其他随机数函数的用法和 random库的用法是一样的,可以在random库了解更多random的函数。需要注意的是,在random库中,是包括左右边界的;而在np.random中是不包括右边界的。
(2)np.random.choice()
np.random.choice(a,size) 在a中随机选取size数量的元素,元素之间有可能重复。a可以为一个数,也可以是一个列表。若是一个数,则表示为 range(0,a)。
a = np.random.choice(10,(3,2))
print(a)
(3)np.random.shuffle()
np.random.shuffle(a) 洗牌,把数组a随机打乱。注意该函数是直接作用于a的,如果重新定义变量,得到的会是None。如果想赋给新变量,可以使用 np.random.permutation函数。
a = np.random.choice(10,(3,2))
print(a)
print('-'*50)
np.random.shuffle(a)
print(a)
知识点:一维打乱元素,二维只打乱行的顺序,三维只打乱块的顺序。大家也可以亲自去试试。
(4)np.random.permutation()
np.random.permutation(a) 作用和 np.random.shuffle(a)一样,但该函数可以对洗牌后的数组赋予新变量,使原数组不发生改变。
a = np.random.choice(10,(3,2))
print(a)
print('-'*50)
b = np.random.shuffle(a) # 无法赋予给新变量b,若赋予,会得到None
print(b)
print('-'*50)
c = np.random.permutation(a) # 可以赋予给新变量c
print(c)
shuffle 和 permutation 的区别在于:前者是在原来是数组上打乱;后者是新定义一个变量(如c),使新变量改变,而原数组不变。
7. 数组维度/形状的转换/转置
(1)arr.reshape()
arr.reshape(shape, order='C') 把数组转换为shape形状。
arr = np.arange(1,25)
print