[Python数据科学手册]2.2NumPy数据基础

319 阅读3分钟
# 定义三个随机的数组:一个一维数组、 一个二维数组和一个三维数组。
# 我们将用 NumPy 的随机数生成器设置 一组种子值,
# 以确保每次程序执行时都可以生成同样的随机数组:
import numpy as np 
np.random.seed(0) #设置随机种子

x1 = np.random.randint(10,size=6) # 一维数组 ,如果不定义范围就是[0,10)
x2 = np.random.randint(10,size=(3,4)) #二维数组
x3 = np.random.randint(10,size=(3,4,5))#三维数组

# 每个数组有 nidm(数组的维度)、
# shape(数组每个维度的大小)
# 和 size(数组的总大小)属性:
print('x3 ndim: ',x3.ndim)
print('x3 shape:',x3.shape)
#shape:(3,4,5) 即三个二维数组,四行五列
print('x3 size: ',x3.size)
print(x1)

print('dtype:',x3.dtype)

# 每个数组元素字节大小的 itemsize,
# 以及表示数组总字节大小的属性 nbytes
print('itemsize:',x3.itemsize,'bytes')
print('nbytes:',x3.nbytes,'bytes')
#可以认为 nbytes 跟 itemsize 和 size 的乘积大小相等

# 在一维数组中,你也可以通过中括号指定索引获取第 i 个值
x1
x1[0]
x1[4]

# 为了获取数组的末尾索引,可以用负值索引
x1[-1]
x1[-2]

x2
x2[0,0]
x2[2,0]
x2[2,-1]

x2[0,0] = 12
x2

#试图将一个浮点值插入一个整型数组时,浮点值会被截短成整型。
# 并且这种截短是自动完成的,不会给你提示或警告
x1[0] =3.14159
x1

#x[start:stop:step]
#如果以上3个参数都未指定,那么它们会被分别设置默认值 start=0、 
# stop=维度的大小(size of dimension),step=1。
x = np.arange(10)
x
x[:5] #前五个元素
x[5:] #五之后的元素
x[4:7] #中间子数组
x[::2] #隔一个元素
x[1::2] #从索引1开始,隔一个元素

x[::-1] #所有元素逆序



x[5::-2] #从索引5开始每隔一个元素逆序

x2
x2[:2,:3] #两行三列
x2[:3,::2] #所有行,每隔一列
x2[::-1,::-1]

x2[:,0] #x2的第一列
x2[0,:] #x2的第一行
x2[0]  #等于x2[0,:]

# 数组切片返回的是 数组数据的视图,而不是数值数据的副本
# 在 Python 列表中,切片是值的副本
x2
x2_sub = x2[:2,:2]
x2_sub
#修改这个子数组,将会看到原始数组也被修改了
x2_sub[0,0] = 99
x2

#创建数组的副本
x2_sub_copy = x2[:2,:2].copy()
x2_sub_copy
x2_sub_copy[0,0] = 42
x2_sub_copy
x2

#数组的变形
#如果想将数字1~9放入一个3*3矩阵
#数组最灵活的实现方式是通过reshape()函数来实现的
#原始数组的大小必须和变形后数组的大小一致
grid = np.arange(1,10).reshape((3,3))
grid

# 将一个一维数组转变为二维的行或列的矩阵

x = np.array([1,2,3])
x.shape
#通过变形获得行向量
#得到一个一行三列的向量
x.reshape((1,3))
#通过newaxis获得行向量
#在shape左侧加一
# (3,) -> (1,3)
#(1,3) -> (1,1,3)
a = x[np.newaxis,:]
a = a[np.newaxis,:]
a.shape
#通过变形获得列向量
x.reshape((3,1))
#通过newaxis获得列向量
#在shape右侧加一
# (3,)->(3,1)
x[:,np.newaxis].shape
#数组的拼接
x = np.array([1,2,3])
y= np.array([3,2,1])
np.concatenate([x,y])
#concatenate 连接,连结
#也可以一次性拼接两个以上数组:
z = [99,99,99]
np.concatenate([z,x,y])
#也可以用于二维数组的拼接
grid = np.array([[1,2,3],
                [4,5,6]])
np.concatenate([grid,grid]) #沿第一个轴拼接
np.concatenate([grid,grid],axis=1) #沿第二个轴拼接
#axis 轴
# 沿着固定维度处理数组时,
# 使用 np.vstack(垂直栈)和 np.hstack(水平栈)函数会更简洁:
x = np.array([1,2,3])
grid = np.array([[9,8,7],[6,5,4]])
np.vstack([x,grid])#垂直栈数组
#水平栈数组
y = np.array([[99],[99]])
np.hstack([grid,y])

#数组的分裂
x = [1,2,3,99,99,3,2,1]
#索引列表记录的是分裂点位置
x1,x2,x3 = np.split(x,[3,5])
print(x1,x2,x3)
grid = np.arange(16).reshape((4,4))
grid
upper,lower = np.vsplit(grid,[2]) #水平分割
print(upper)
print(lower)
left,right = np.hsplit(grid,[2]) #竖直分割
print(left)
print(right)