Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包。它是咱们课程所介绍的其余高级工具的构建基础。python
其部分功能以下:编程
Numpy自己并无提供那么多高级的数据分析功能,理解Numpy数组以及面向数组的计算将有助于咱们更加高效的使用pandas之类的工具。数组
Numpy最重要的一个特色就是其N纬数组对象(即ndarray),该对象是一个快速而灵活的大数据集容器。你能够利用这种数组对整块的数据执行一些数学运算。dom
ndarray是一个通用的同构数据多维容器,其中的全部元素必须是相同类型的。每一个数组都有一个shape(表示各维度大小的元组)和一个dtype(表示数组数据类型的对象):函数
咱们将会介绍Numpy数组的基本用法,虽说大多数数据分析工做不须要深刻理解Numpy,但精通面向数组的编程和思惟方式是成为Python科学计算牛人的一大关键步骤。工具
注意: 咱们将依照标准的Numpy约定,即老是使用import numpy as np. 固然你也能够为了避免写np,而直接在代码中使用from numpy import *, 可是建议你最好仍是不要养成这样的坏习惯。性能
esc切换到命令模式,大数据
输入dd 删除当前单元格ui
a在当前单元格前面增长一个单元格spa
b在当前单元格后面增长一个单元格
建立数组最简单的方法就是使用array函数。它接收一切序列型的对象(包括其余数组),而后产生一个新的含有传入数据的Numpy数组。
import numpy as np
ndarray1 = np.array([1, 2, 3, 4, 5]) ndarray1
查看数组的类型
ndarray1.dtype
查看数组的shape(看维数和数组的长度,一维的只显示数组的长度)
ndarray1.shape
这里要用一个大列表,把里面的数组包起来
ndarray2 = np.array([[1, 2, 3, 4], [2, 4, 6, 8]]) ndarray2
查看数组的shape
查看数组的类型
ndarray2.dtype
ndarray3 = np.array(list('abcdefg')) ndarray3
查看数组的类型
ndarray3.dtype
查看数组的shape
ndarray3.shape
它的类型是Float
用于建立数组,数组元素默认值是0. 注意:zeros_linke函数只是根据传入的ndarray数组的shape来建立全部元素为0的数组,并非拷贝源数组中的数据.
ndarray3 = np.zeros(5) ndarray3
查看类型
ndarray3.dtype
ndarray4 = np.zeros((2, 2)) ndarray4[0][0] = 100 ndarray4
like版本的函数表示按照参数的shape建立数组
ndarray5 = np.zeros_like(ndarray4) ndarray5
值并不和 ndarray4 的值同样,只是和它的维度和长度有关
用于建立全部元素都为1的数组.ones_like用法同zeros_like用法.
ndarray6 = np.ones([3, 3])
np.ones_like(ndarray6)
用于建立空数组,空数据中的值并不为0,而是未初始化的随机值(垃圾值)
ndarray6 = np.ones([3, 3])
ndarray6
ndarray7 =np.empty_like(ndarray6) ndarray7
该函数用于建立一个N*N的矩阵,对角线为1,其他为0.
np.eye(5)
arange函数是python内置函数range函数的数组版本.
#产生0-9共10个元素 ndarray8 = np.arange(10) ndarray8
# 产生10 12 14 16 18, 2为step ndarray9 = np.arange(10, 20, 2) ndarray9
咱们能够经过ndarray的dtype来打印数组中元素的类型. ndarray常见的数据类型以下:
ul 表示无符号正数,没有负数
类型 | 类型代码 | 说明 |
---|---|---|
int八、uint8 | i一、u1 | 有符号和无符号的8位(1个字节长度)整型 |
int1六、uint16 | i二、u2 | 有符号和无符号的16位(2个字节长度)整型 |
int3二、uint32 | i四、u4 | 有符号和无符号的32位(4个字节长度)整型 |
float16 | f2 | 半精度浮点数 |
float32 | f4或f | 标准单精度浮点数 |
float64 | f8或d | 双精度浮点数 |
bool | ? | 布尔类型 |
object | O | Python对象类型 |
unicode_ | U | 固定长度的unicode类型,跟字符串定义方式同样 |
import numpy as np ndarray1 = np.array([1, 2, 3, 4]) ndarray2 = np.array(list('abcdefg')) ndarray3 = np.array([True, False, False, True]) class Person(object): pass ndarray4 = np.array([Person(), Person(), Person()])
依次查看类型
ndarray1.dtype
ndarray5 = np.array([1, 2, 3, 4, 5]) # 类型转换完毕返回新的数组 ndarray6 = ndarray5.astype(np.float32)
ndarray6.dtype
ndarray7 = np.array([1.1, 2.2, 3.3, 4.4]) # 若是浮点数转换为整数,则小数部分将会被截断 ndarray8 = ndarray7.astype(np.int32)
ndarray8
ndarray9 = np.array(['10', '20', '30', '40']) # 若是某些字符串数组表示的全是数字,也能够用astype将其转换为数值类型 ndarray10 = ndarray9.astype(np.int32) ndarray10
快速切换到Markdown的快捷键 Esc +M
不须要循环便可对数据进行批量运算,叫作矢量化运算. 不一样形状的数组之间的算数运算,叫作广播.
ndarray2= np.arange(9).reshape((3,3)) ndarray2
ndarray3 = np.arange(10) ndarray3+100
ndarray3 * 10
ndarray2+100
ndarray1 = np.arange(10) ndarray1>2
np.random.randint(0, 10, 5)
np.random.randint(0, 10, (3, 4))
ndarray4 = np.random.randint(0, 10, 5) ndarray4
ndarray5 = np.random.randint(0, 10, 5) ndarray5
ndarray4 + ndarray5
ndarray6 = np.random.randint(0, 10, (3, 4)) ndarray6
ndarray7 = np.random.randint(0, 10, (3, 4)) ndarray7
ndarray6+ndarray7
ndarray8 = np.random.randint(0, 10, 4) ndarray8
ndarray6 + ndarray8
一维数组和多维数组进行想加是每一行,每一行进行广播想加
Numpy数组的索引是一个内容丰富的主题,由于选取数据子集或单个元素的方式有不少。一维数组很简单。从表面上看,它们和Python列表的功能差很少。
ndarray1 = np.arange(25).reshape((5, 5)) ndarray1
获取二维数组的第一个元素(数组)
ndarray1[0]
获取二维数组第一个元素的第二个元素
ndarray1[0][1]
获取二维数组的前三个元素(数组)
ndarray1[:3]
获取二维数组的前三个元素的前两个元素
ndarray1[:3][:2]
获取二维数组的前三个元素,每一个元素从2开始切片
ndarray1[:3,2:]
注意:
ndarray2 = np.empty((8,8)) for val in range(8): ndarray2[val]= np.arange(val,val+8) ndarray2
获取指定下标元素的集合
ndarray2[[1,3,5]]
获取筛选后的1,2元素
ndarray2[[1,3,5]][[1,2]]
获取筛选后每一个元素的第0个元素
ndarray2[[1,3,5],0]
获取筛选后每一个元素,从下标0开始切片到2
ndarray2[[1,3,5],:2]
获取每一个元素的指定的元素
ndarray2[[1,3,5],[0,1,2]]
# 获取一个随机3行4列的数组 country_data = np.random.randint(1000,10000,(4,3)) country_data
country_index = np.array(['中国','美国','德国','法国'])
country_index
country_index == '美国'
# 也就是一个数组里面又嵌套了一个数组 country_data[country_index == '美国']
country_col=np.array(['经济','军事','人口'])
# 先计算军事这个元素在数组中第几个位置 np.argwhere(country_col == '军事')
取出这个位置
np.argwhere(country_col == '军事')[0][0]
获取法国的人口
country_data[country_index == '法国'][0][np.argwhere(country_col == '人口')[0][0]]
np.argwhere(条件)
np.argwhere(country_data == 8377)
names = np.array(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg']) data = np.arange(35).reshape((7, 5)) data
ret1 = data[names == 'ccc'] ret1
布尔类型数组和整数混合使用
ret2= data[names == 'ccc', 2] ret2
布尔类型数组和切片混合使用
ret3= data[names == 'ccc', 1:] ret3
ret1 = data[names != 'ccc'] ret1
ret2 = data[~(names == 'ccc')] ret2
ret3 = data[~(names > 'ccc')] ret3
ret1 = data[(names == 'aaa') | (names == 'ccc')] ret1
ret2 = data[(names > 'ddd') | (names == 'aaa')] ret2
ret3 = data[(names < 'eee') & (names > 'bbb') ] ret3
ndarray1 = np.arange(5) ndarray2 = np.arange(16).reshape((4, 4)) names = np.array(['aaa', 'bbb', 'ccc', 'ddd'])
将数组ndarray1中全部大于2的元素设置成666
ndarray1[ndarray1 > 2] = 666 ndarray1
将ndarray2的aaa这一行全部的元素设置为0
ndarray2[names == 'aaa'] = 0 ndarray2
将ndarray2的bbb这一行2位置日后全部的元素设置为1
ndarray2[names == 'bbb', 2:] = 1 ndarray2
将ndarray2的ccc ddd这2行全部的元素设置为2
ndarray2[(names == 'ccc') | (names == 'ddd')] = 2 ndarray2
zip([列表1],[列表2])用法,拿列表中1的值,在拿列表2中的值,进行一一对应
for a,b in zip([ True, True, False, True, True, True, True],data): print(a,b)
# 只取为真的值 for a,b in zip([ True, True, False, True, True, True, True],data): if a: print(a,b)
np.where()函数的使用-----------> np.where(条件,知足条件是什么值,不知足条件是什么值)
ndarray1 = np.random.randint(-10, 10, (5, 5)) ndarray1
np.where(ndarray1<0,100,ndarray1)
np.where(ndarray1>-3,np.where(ndarray1<3,100,ndarray1),ndarray1)