主要内容:
3、 索引与切片
一、ndarry对象
N 维数组对象,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
1、创建ndarry
1.1、array()
参数说明:
'''
np.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
常用参数:
1、object:列表、元组之类的序列对象
2、dtype:指定数组的数据类型
'''
代码:
import numpy as np
# 列表
list1 = [4,5,6]
# 创建ndarry
t1 = np.array(list1,dtype = "int8")
t1
output:
array([4, 5, 6], dtype=int8)
1.2、asarray()
参数说明:
'''
np.asarray(a, dtype=None, order=None)
常用参数:
1、object:列表、元组之类的序列对象
2、dtype:指定数组的数据类型
'''
# 创建ndarry
t2 = np.asarray(t1,dtype = "int8")
t2
output:
array([4, 5, 6], dtype=int8)
提问:
那么array()和asarray有什么区别呢?
当传入的对象是列表时,二者无区别。
当传入的对象时ndarry时,二者有区别:
1、array() 默认拷贝输入的原序列对象,占用新的内存空间
2、asarray() 默认不copy该对象,意味着修改新生成的ndarray数据,会改变原ndarray的数据。
如下:
# 基于ndarray t1创建新的ndarry
t2 = np.asarray(t1,dtype = "int8")
# 修改t2的数据
t2[1] = 10
t1
output:
1.3、arange()
参数说明:
'''
arange([start,] stop[, step,], dtype=None)
参数解释:
start:开始数字
end:结束数字
step:步长
dtype:数据类型
注意:
区间为左闭右开
'''
代码:
# 等同于t3 = np.array(range(1,11,1))
t3 = np.arange(1,11,1,dtype='int8')
t3
output:
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=int8)
1.4、linspace()
等差数列
参数说明:
'''
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数解释:
start:开始数字
stop:结束数字
num:生成的元素个数
endpoint:生成的数组是否包含结束数字,默认为True;设置为False,则数组不包括结束数字
注意:
区间默认为为左闭右闭
原理:步长=极差/间隔
即为步长=(stop -start)/(num -1)
'''
代码:
t4 = np.linspace(5,10,5,endpoint = True)
t4
output:
array([ 5. , 6.25, 7.5 , 8.75, 10. ])
设置endpoint = False看看
t4 = np.linspace(5,10,5,endpoint = False)
t4
output:
array([5., 6., 7., 8., 9.])
1.5、logspace()
等比数列
参数说明:
''''
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
参数解释:
start:开始数字
stop:结束数字
num:生成的元素个数
base:对数 log 的底数,用于设置等比数列的底数。
endpoint:生成的数组是否包含结束数字,默认为True;设置为False,则数组不包括结束数字
原理:
1、先生成等差数列:np.linspace(start,end,num,endpoint=True)
2、以base为底数:base ** np.linspace(start,end,num,endpoint=True)
'''
代码:
t5 = np.logspace(1,5,num= 5,base = 2)
t5
output:
array([ 2., 4., 8., 16., 32.])
1.6、zeros(shape)
生成元素全是0的数组
'''
np.zeros(shape)
shape:数组的形状
'''
# 创建一个形状为三行四列的数组
a= np.zeros((3,4))
a
output:
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
1.7、ones(shape)
生成元素全是1的数组
'''
np.ones(shape)
shape:数组的形状
'''
np.ones((5,3))
output:
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
1.8、eyes()
创建对角线为1的正方形数组
'''
np.eye(N, M=None, k=0, dtype=<class 'float'>, order='C')
常用参数说明:
N:输出多少行
M:输出多少列,不指定则等于N
'''
np.eye(6)
output:
array([[1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 1.]])
1.9、diag()
指定矩阵对角线元素
'''
np.diag(v, k=0)
k:对角线元素
'''
np.diag([3,4,5])
output:
array([[3, 0, 0],
[0, 4, 0],
[0, 0, 5]])
2、ndarray的基本属性
2.1、dim
数组维度个数
'''
np.dim 数组维度个数(秩)
NumPy的主要对象是同种类型元素的多维数组。
在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。
'''
# 一维数组
a = np.array([1,2,3])
a.ndim
output:
1
# 二维数组
a = np.array([[1,2,3],[4,5,6]])
a.ndim
output:
2
2.2、shape
数组的形状
'''
np.shape 返回数据为元组类型
'''
# 一维数组的形状
a = np.array([1,2,3])
print(a)
a.shape
output:
[1 2 3]
(3,)
# 二维数组的形状
a = np.array([[1,2,3],[4,5,6]])
print(a)
a.shape
output:
[[1 2 3]
[4 5 6]]
(2, 3)
2.3、size
数组元素的个数
# 二维数组
a = np.array([[1,2,3],[4,5,6]])
print(a)
a.size
output:
[[1 2 3]
[4 5 6]]
6
2.4、dtype
数组元素的数据类型
print(a)
a.dtype
output:
[[1 2 3]
[4 5 6]]
dtype('int32')
数组数据类型的修改
ndarray.astype(new_type)
a.astype('int32')
a.astype(np.int64)
ndarray.tostring() 序列化到本地
a.tostring()
2.5、itemsize
每个元素的字节大小
'''
一个元素数据类型为float64的数组itemsiz属性值为8(=64/8)
一个元素数据类型为int32的数组item属性为4(=32/8).
'''
a.itemsize
output:
4
3、索引与切片
3.1、元素索引
'''
元素索引:通过单个整数值来索引元素
'''
# 一维数组
n1 = np.array([2,3,4,5,6,7])
# 取单个元素(取下标为2,即第三个元素)
n1[2] # 4
# 二维数组
n2 = np.arange(20).reshape(5,4)
n2
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15],
# [16, 17, 18, 19]])
n2[1,2]
# 6
3.2、 切片索引: 索引连续的数组子集
利用切片进行索引,切片语法与list差不多。
'''
一维数组的切片索引操作同python原生数组操作一样
ndarray[start:end:step]
左闭右开
'''
n1 = np.array([2,3,4,5,6,7])
# 取连续的元素
n1[1:4] # array([3, 4, 5])
# 取倒数的元素
n1[-4:-2] # array([24, 5])
'''
二维数组的切片索引操作
ndarrays[start:stop:step,start:stop:step]
左闭右开
'''
n2 = np.arange(20).reshape(5,4)
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15],
# [16, 17, 18, 19]])
# 取多行数据
n2[1:4:2]
# array([[ 4, 5, 6, 7],
# [12, 13, 14, 15]])
# 取多列数据
n2[:,-4-2]
# array([[ 0, 1],
# [ 4, 5],
# [ 8, 9],
# [12, 13],
# [16, 17]])
# 多行多列
n2[1:3,2:4]
# array([[ 6, 7],
# [10, 11]])
3.3、 花式索引:
花式索引:通过整型数组进行索引
n2
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15],
# [16, 17, 18, 19]])
# 使用两个整数数组来对axis= 0,1两个轴进行花式索引(按坐标索引数据)
n2[[2,1],[0,1]] # 坐标(2,0)、(1,1)
# array([8, 5]
# 交换行(交换第三行和第二行顺序)
n2[[2,1]]
# array([[ 8, 9, 10, 11],
# [ 4, 5, 6, 7]])
# 交换列(交换第三列和第二列顺序)
n2[:,[2,1]]
# array([[ 2, 1],
# [ 6, 5],
# [10, 9],
# [14, 13],
# [18, 17]])
np.ix_()
'''
np.ix_()
输入选取的行数组与列数组,取交集方形区域的数据
'''
n2[np.ix_([2,3],[0,1,3])]
# array([[ 8, 9, 11],
# [12, 13, 15]])
'''
等价于np.ix_
该花式索引要掌握~!
'''
n2[[2,3]][:,[0,1,3]]
# array([[ 8, 9, 11],
# [12, 13, 15]])
3.4、 布尔索引:
'''
布尔索引
通过条件进行逻辑判断,返回True/False,利用布尔值进行索引
'''
n2
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15],
# [16, 17, 18, 19]])
# 同时满足两个条件即为真,否则假
(n2>4) & (n2<18)
# array([[False, False, False, False],
# [False, True, True, True],
# [ True, True, True, True],
# [ True, True, True, True],
# [ True, True, False, False]])
# & 并且
n2[(n2>4) & (n2<18)]
# array([ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17])
# | 或 满足其中一个条件即可
n2[(n2>4) | (n2<18)]
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
# 17, 18, 19])