NumPy的ndarray:一种多维数组对象
- ndarray对象是一个N维数组对象,是一个灵活快速的大数据容器
可以利用ndarray数组对整块数据执行一些数学运算 - ndarray是一个通用的同构数据多维容器,即其中的元素必须是同种类型的
- 每个数组都有一个shape(表示各维度大小的元组),和一个dtype(说明数组数组类型)
创建ndarray
- 使用array函数,array函数接受一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的NumPy数组
- 嵌套序列(如一组等长列表组成的长列表),将会被转化成一组多维数组
- np.array会为新建的数组推断出一个较为合适的数据类型,存储在dtype对象中
- np.zero、np.ones、np.empyty都可以新建数组,分别返回全是0,全是1,以及没有任何具体数值(垃圾值)的数组,用这些方法创建多维数组的时候,需要传入一个表示形状的元组
- np.arange可返回一维数组,作用类似于range
(NumPy关注的是数值计算,如果没有特别的指定,数据类型基本都是float64)
import numpy as np
# 使用array函数新建ndarray数组
arr = np.array([1,2,3])
print(arr)
# 数据类型
print(arr.dtype)
print(arr.shape)
# asarray 将输入转换成ndarray
num = [1,2,3,4,5]
arr2 = np.asarray(num)
print(arr2)
# arange类似于range函数,返回一维ndarray
arr3 = np.arange(10)
print(arr3)
# ones,zeros根据指定形状和dtype创建全是1/全是0的数组
arr4 = np.ones((2,2), dtype = 'int16')
print(arr4)
arr5 = np.zeros((2,3))
print(arr5)
# ones_like,zeros_like创建与指定数组相似的都是1/都是0的数组
arr6 = np.ones_like(arr2)
print(arr6)
arr7 = np.zeros_like((3,4))
print(arr7)
# empty创建新数组,只分配内存空间不填充任何值
arr8 = np.empty((2,2))
print(arr8)
# empty_like创建与指定数组相似的数组
arr9 = np.empty_like((2,2),dtype='int64')
print(arr9)
# eye,identity创建一个正方的 N*N单位矩阵(对角线为1,其余为0)
arr10 = np.eye((3))
print(arr10)
arr11 = np.identity((4),dtype = 'float64')
print(arr11)
ndarray 的数据类型
- dtyped的命名方式:类型名+表示各元素位长的数字
e.g. float64, int16, int32 - 通过ndarray的astype方法转换dtype,此时会创建一个新的数组(原始数据的一个拷贝)
- 注意,浮点数(如float32和float64)只能表示近似的分数值。在复杂的计算中,由于可能会积累一些浮点错误,因此此操作只能在一定小数位内有效
arr = np.array([1,2,3,4,5])
arr.dtype # dtype('int32')
float_arr = arr.astype('float64')
float_arr.dtype # dtype('float64')
基本的索引和切片
- 将标量赋值给一个切片时,该值会广播到整个选区。数组切片是原始数组的视图,任何修改都是在源数组进行修改
- 如果想要切片副本,需要用arr[1:3].copy()
- 高维数组从低维度到高维度按顺序返回索引
切片索引
1. 高维数组可一次传入多个切片
2. 高维数组可以将整数索引和切片混合,返回低维度的切片
# 切片的广播
arr = np.arange(10)
print(arr[1:3])
arr[1:3] = 11
print(arr)
# 切片副本
arr_copy = arr[:].copy()
print(arr_copy)
# 高维数组索引
arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr_n[0][1])
# 高维数组切片
arr2d[:2,:1]
arr2d[2,:2]
布尔型索引
- 布尔型索引:布尔型的ndarray对象
names = np.array(['Bob','Joe','Will','Joe','Joe'])
names == 'Joe' # array([False, True, False, True, True])
- 可使用布尔型索引作为数组索引,但布尔型数组的长度必须和被索引的轴长度一致
- 还可以将布尔型索引与切片、整数混合使用
花式索引(Fancy indexing)
利用整数数组进行索引
数组转置和轴对换
- 转置(transpose),返回源数据视图。简单的转置用.T
arr = np.arange(15).reshape((3,5))
arr.T
- 高维数组的转置需要得到一个由轴编号组成的元组才能对这些轴进行转置
arr = np.arange(16).reshape((2,2,4))
arr.transpose((1,0,2))
- 使用swapaxes方法,需要接受一对轴编号,返回源数据视图
arr.swapaxes(1,2)