(9)numpy基础1:数组与向量化计算

1 初识numpy

1.1定义

是 Numerical Python 简称,它是python数值计算最为重要的基础包,基于numpy的科学函数功能,将numpy的数值对象作为数据交换的通用语

NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

(1)ndarray,高效多维数组,基于数组计算及广播功能函数

(2)对硬盘中数组数据进行读写的工具,并对内存映射文件进行操作

(3)用numpy连接 C/C++/Fortran语言类库的c语言API

将数据传给底层语言编写的外部类库,再将计算结果按照numpy的方式返回

(4)线性代数、傅里叶变换、随机数生成等功能

1.2 numpy重要的主要原因

(1)numpy在内部将数据储存在连续的内存块之上,其算法库是c语言写的,内存量小于python的其他内建的序列

(2)可针对全量数组进行复杂计算

1.3 举例验证

import numpy as np
my_arr = np.arange(1000000)
my_list = list(range(1000000))
%time for _ in range(10): my_arr2 = my_arr * 2 # %time返回运行时间,_ 为占位符
%time for _ in range(10): my_list2 = [x * 2 for x in my_list]

(9)numpy基础1:数组与向量化计算_第1张图片

 numpy计算要比python正常计算快10-100倍,且占的内存更少

2 核心特征 ndarray: 多维数组对象

2.1 定义

ndarray是大型数据集容器,数组允许使用类似于标量的操作语法在整块数据上进行数据计算

包括的每一个元素均为相同类型

当看到“数组”、“numpy数组”或ndarray,均表示同一个ndarray对象

2.2 牛刀小试

import numpy as np
# Generate some random data
data = np.random.randn(2, 3)
data
data * 10
data + data
data.shape
data.dtype

(9)numpy基础1:数组与向量化计算_第2张图片

2.3 生成ndarray

(1)生成数组最简单的方式就是使用array函数,接受任意序列型对象,举例:

import numpy as np
data1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(data1)
arr1
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr2 = np.array(data2)
arr2
arr2.ndim
arr2.shape
arr1.dtype
arr2.dtype

(9)numpy基础1:数组与向量化计算_第3张图片

(2)创建初始化数组

np.zeros(10)
np.zeros((3, 6))
np.empty((2, 3, 2))

 (9)numpy基础1:数组与向量化计算_第4张图片

 (3)创建有数据的数组

np.arange(15)

 2.4 ndarray的数据类型

数据类型,即dytpe,包含了ndarray的元数据

(1)指定类型创建数组 dtype

arr1 = np.array([1, 2, 3], dtype=np.float64)
arr2 = np.array([1, 2, 3], dtype=np.int32)
arr1.dtype
arr2.dtype

(9)numpy基础1:数组与向量化计算_第5张图片

(2)显式地转换数组的数据类型 astype

使用astype时,总是生成一个新的数组

arr = np.array([1, 2, 3, 4, 5]) #创建数组
arr.dtype #int类型
float_arr = arr.astype(np.float64) #显式int转成float类型
float_arr.dtype
arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
arr
arr.astype(np.int32) #显式float转成int类型
numeric_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_)
numeric_strings.astype(float) #显式string转成float类型

(9)numpy基础1:数组与向量化计算_第6张图片

 注意:numpy数组使用字符串类型时,会修正它的大小或删除输入且不发出警告

int_array = np.arange(10)#int类型
calibers = np.array([.22, .270, .357, .380, .44, .50], dtype=np.float64) #float类型
int_array.astype(calibers.dtype) #a变量的类型转成b变量的类型
empty_uint32 = np.empty(8, dtype='u4')
empty_uint32 

(9)numpy基础1:数组与向量化计算_第7张图片

3 numpy 数组算术

数组允许批量操作而无须for循环,即为特性向量化

任何等尺寸数组之间的算术操作都应用了逐元素操作的方式

arr = np.array([[1., 2., 3.], [4., 5., 6.]])
arr
arr * arr #带有标量的算术操作,会把计算参数传递给数组的每一个元素
arr - arr
1 / arr
arr ** 0.5
arr2 = np.array([[0., 4., 1.], [7., 2., 12.]])
arr2
arr2 > arr #比较数组 会生成布尔数组
不同尺寸的数组操作,将会用到广播特性

(9)numpy基础1:数组与向量化计算_第8张图片

4 索引与切片 

4.1 多维数组取值

索引从0开始,包前不包后(结束索引值不包括)

numpy数组的索引,取数据的子集或某个单个元素,数组的切片是原数组的视图,说明子集数组并不是被复制了,任何对于视图的修改都会反映到原数组上

一维数组取值  arr[起始索引值:结束索引值] 

arr = np.arange(10)
arr
arr[5]  #取固定位置数据
arr[5:8] #取5-8索引的切片
arr[5:8] = 12 #将5-8索引位置的数据,重新赋值
arr
arr_slice = arr[5:8]
arr_slice #重新取出原数组,结果是已修改后的
arr_slice[:] = 64 #子数组重新赋值,也反映在原数组,[:] 无指定的起始和结束索引,则就全部取出
arr
二维数组取值 arr[起始索引值1:结束索引值1,起始索引值2:结束索引值2] 

在二维数组中,每个索引值对应的元素不是一个值,而是一个数组

arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) #定义二维数组
arr2d[2] #取第3个的整个一维数组
arr2d[0][2] #锁定唯一数组的方式一
arr2d[0, 2] #锁定唯一数组的方式二
arr2d[0:2, 0:3] #取多维数组的值
三维数组取值
以下返回的数组都是视图
arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
arr3d
arr3d[0] #取出的是2x3的数组
old_values = arr3d[0].copy()
arr3d[0] = 42 #取出重新赋值
arr3d
arr3d[0] = old_values
arr3d
arr3d[1, 0] #取出的是一维的数组
x = arr3d[1] #分步取出二维数组
x
x[0] #分步取出一维数组 

(9)numpy基础1:数组与向量化计算_第9张图片

4.2 布尔索引

使用布尔值索引选择数据时,生成的数据是拷贝的,原数组不发生改变,布尔数组

names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7, 4) #产生随机行7和列4的数组
names
data
names == 'Bob' #轮询判断数组中的值是否等于'Bob',返回判断结果的布尔数组
data[names == 'Bob'] #轮询返回的布尔数组,当为true时,返回对应位置的一维数组
data[names == 'Bob', 2:] #同上,返回一维数组时,截取其一维数据的子集片段
data[names == 'Bob', 3] 
names != 'Bob' 
data[~(names == 'Bob')] #~ 指数值取反的数值
cond = names == 'Bob' #赋值给变量
data[~cond]
mask = (names == 'Bob') | (names == 'Will') #还可以多个条件判断,返回判断结果的布尔数组
mask
data[mask]
data[data < 0] = 0 #本身数值判断,再返回当为true时的数值
data
data[names != 'Joe'] = 7 #满足条件的重新赋值
data

(9)numpy基础1:数组与向量化计算_第10张图片

(9)numpy基础1:数组与向量化计算_第11张图片

 (9)numpy基础1:数组与向量化计算_第12张图片

 4.3 神奇索引

索引数组,指定多维数组的位置索引 

arr = np.empty((8, 4)) #预定义多维空数组
for i in range(8):
    arr[i] = i #多维数组赋值
arr 
arr[[4, 3, 0, 6]] #据多维数组的索引一维数组位置,取值
arr[[-3, -5, -7]]
arr = np.arange(32).reshape((8, 4))
arr
arr[[1, 5, 7, 2], [0, 3, 1, 2]]  #据多维数组的索引,取值
arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]

(9)numpy基础1:数组与向量化计算_第13张图片

5 数组转置和换轴

转置是一种特殊的数据重组形式,可返回底层数据的视图,不复制,数组拥有transpose方法,也有特殊的T属性

arr = np.arange(15).reshape((3, 5)) #定义有值范围的,固定行列数组
arr
arr.T  #转置数组
arr = np.random.randn(6, 3) #定义随机数,固定行列数组
arr
np.dot(arr.T, arr) #计算数组内的点积 dot(a,b)  a的行乘以b的列的和
arr = np.arange(16).reshape((2, 2, 4))
arr
arr.transpose((1, 0, 2)) #指x轴和y轴置换(三维数组:x、y、z轴的置换)
transpose(1,0,2): 表示X轴与Y轴发生变换之后
transpose(0,2,1):表示Y轴与Z轴发生轴变换之后
transpose(2,1,0):表示X轴与Z轴发生轴变换之后
arr
arr.swapaxes(1, 2)

(9)numpy基础1:数组与向量化计算_第14张图片

 (9)numpy基础1:数组与向量化计算_第15张图片

本篇知识点参考《利用python进行数据分析》,更多知识请阅读原书

你可能感兴趣的:(python,numpy,python,开发语言,后端)