1.创建
(1)ndarray数据类型
bool
inti(由所在平台决定其精度的整数)、int8、int16、int32、int64(有符号整数)
unit8、unit16、unit32、unit64(无符号整数)
float16、float32、float64/float(浮点数)
complex64(复数,分别用两个32位浮点数表示实部和虚部)、complex128/complex(用两个64位浮点数表示实部和虚部)
同一个ndarray中所有元素类型必须一致。
实数数据类型之间的数据转换如下:
import numpy as np
np.float64(42)
np.int8(42.0)
np.bool(42)
np.int(True)
(2)ndarray创建
1)array函数
np.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0, like=None)
object:接收array,list,tuple等。
dtype:表示创建的数组的类型,默认值为保存对象所需的最小字节数的数据类型。
创建一维与二维数组:
np.array([1,2,3,4])
>array([1, 2, 3, 4])
np.array([[1,2,3,4],[5,6,7,8]])
>array([[1, 2, 3, 4],
[5, 6, 7, 8]])
ndarray的常用属性如下:
arr=np.array([[1,2,3,4],[5,6,7,8]])
arr.ndim#维数
>2
arr.shape#尺寸
>(2, 4)
arr.size#元素总数
>8
arr.dtype#元素类型
>dtype('int32')
arr.itemsize#每个元素的大小,以字节为单位(int32具有32/8=4个字节)
>4
2)其他创建函数
使用arange(开始值,终止值,步长)创建等差数列:
np.arange(0,1,0,1)
>array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
使用linspace(开始值,终止值,元素个数)创建等差数列:
np.linspace(0,1,10)
>array([0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,
0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])
使用logspace(开始值,终止值,元素个数)创建等比数列:
np.logspace(1,100,5)
>array([1.00000000e+001, 5.62341325e+025, 3.16227766e+050, 1.77827941e+075,
1.00000000e+100])
使用zeros((行数,列数))创建值全为零的矩阵:
np.zeros((2,3))
>array([[0., 0., 0.],
[0., 0., 0.]])
使用eye(对角线元素个数)创建单位矩阵:
np.eye(3)
>array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
使用diag(对角线元素)创建对角矩阵:
np.diag([1,2,3,4])
>array([[1, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 3, 0],
[0, 0, 0, 4]])
使用ones(矩阵维数)创建全为1的矩阵:
np.ones((2,3))
>array([[1., 1., 1.],
[1., 1., 1.]])
(3)随机数
与生成随机数相关的函数全在np.random模块中:
seed:随机数种子
permutation:返回一个序列的随机排列
shuffle:对一个序列进行随机排列
random:产生0-1的随机浮点数
rand:产生指定形状的随机数ndarray
randint:产生给定上下限范围的随机整数
randn:产生正态分布的随机数
binominal:产生二项分布的随机数
normal:产生正态分布的随机数
beta:产生beta分布的随机数
chisquare:产生卡方分布的随机数
gamma:产生伽马分布的随机数
uniform:产生[0,1)均匀分布的随机数
np.random.random(10)
>array([0.49905372, 0.85914534, 0.01105556, 0.78294205, 0.56929015,
0.63081794, 0.29417168, 0.80998379, 0.38684665, 0.49672103])
np.random.rand(2,3)
>array([[0.71282353, 0.87641901, 0.85941578],
[0.74710244, 0.34053078, 0.13364268]])
np.random.randn(2,3)
>array([[ 0.60000428, 0.94897067, 1.20422687],
[-0.65710487, -0.0812635 , -0.45994949]])
np.random.randint(low=1,high=10,size=[2,3])
>array([[9, 4, 9],
[9, 8, 9]])
2.索引与切片
(1)一维索引
arr=np.random.random(10)
arr
>array([0.74412323, 0.5186568 , 0.85832988, 0.29784057, 0.83864654,
0.84512263, 0.77279106, 0.20471927, 0.95401965, 0.67786501])
arr[5]
>0.8451226296662746
arr[3:5]#其实是第四个元素和第五个元素
>array([0.29784057, 0.83864654])
arr[:5]
>array([0.74412323, 0.5186568 , 0.85832988, 0.29784057, 0.83864654])
arr[:-1]#舍弃最后一个
>array([0.74412323, 0.5186568 , 0.85832988, 0.29784057, 0.83864654,
0.84512263, 0.77279106, 0.20471927, 0.95401965])
arr[2:4]=100#修改元素值
arr
>array([ 0.74412323, 0.5186568 , 100. , 100. ,
0.83864654, 0.84512263, 0.77279106, 0.20471927,
0.95401965, 0.67786501])
arr[1:-1:2]#等差提取
>array([ 0.5186568 , 100. , 0.84512263, 0.20471927])
arr[5:1:-1]#倒着提取
>array([ 0.84512263, 0.83864654, 100. , 100. ])
(2)多维索引
多维索引每一个维度都有一个索引,各个索引之间用逗号隔开。
arr=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
arr
>array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
arr[0,2]#第1行,第3列。
>3
arr[1,1:4]#第2行,第2到4列
>array([6, 7, 8])
arr[0:3,1:3]
>array([[ 2, 3],
[ 6, 7],
[10, 11]])
arr[:,0:3]#所有行
>array([[ 1, 2, 3],
[ 5, 6, 7],
[ 9, 10, 11]])
(3)花式索引
arr=np.array([np.arange(i*4,i*4+4) for i in np.arange(6)])
arr
>array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]])
arr[[1,5,4,2],[0,3,1,2]]#相当于返回arr坐标为(1,0),(5,3),(4,1),(2,2)的元素
>array([ 4, 23, 17, 10])
利用ix函数将两个一维的整数ndarray转化为方形区域的索引器:
ix函数实际上先对两个一维数组做笛卡尔积,再找到所有笛卡尔积结果所对应的坐标的元素。
arr[np.ix_([1,5,4,2],[0,3,1,2])
>array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[16, 19, 17, 18],
[ 8, 11, 9, 10]])