(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]])