《numpy学习指南》学习笔记——数组
来源:互联网 发布:美国非农数据统计 编辑:程序博客网 时间:2024/06/15 16:07
1.Numpy数组对象
Numpy中的ndarray是一个多为数组对象,该对象由两部分组成:
- 实际的数据;
- 描述这些数据的元数据
大部分的数组操作仅仅修改元数据部分,而不修改底层的实际数据。
Numpy数组一般是同质的,即数组中的所有元素类型必须是一致的。这样有一个好处:如果我们知道数组中的元素均为同一类型,该数组所用的存储空间就很容易确定下来。与Python中一样,Numpy数组的下表也是从0开始的。
使用arange函数可以创建数组
import numpy as npa = np.array(5)# print a:array([0,1,2,3,4])# type(a):<class 'numpy.ndarray'># a.dtype :dtype('int32')/dtype('int64')# a.shape:(5,)
type(a)获取的是数组a的类型;a.type获取的是数组a中元素的类型,这个结果与安装的Python有关;a.shape返回的是一个元组,元组的元素即为数组每一个维度上的大小。
2.多维数组
创建一个多维数组并显示该数组的维度
m = np.array([arange(2),arange(2)])# m: array([[0,1], [0,1]])m.shape#(2,2)m1 = np.array([m,m])#m1是一个三维数据
通过调用help函数可以查看np.array方法的详细信息
np.array函数的参数列表为:
- object: array_like
- dtype: 指定数组中元素的类型(可选)
- copy: bool类型。默认为True(可选)
- order: {‘K’,’A’,’C’,’F’},默认为为‘K’(可选)
- subok: bool类型,默认为False(可选)
- ndim: int类型,制定数组的最小维数(可选)
np.array([1,2,3],ndim=2)#array([[1,2,3]])np.array([1,2,3],dtype=complex)#array([1.+0.j,2.+0.j,3.+0.j])
2.1 选取数组元素
首先创建一个2x2的多维数组:
a = np.array([[1,2],[3,4]])# array([[1,2], [3,4]])
利用下表选取数组中的元素(与matlab类似)
a[0,0]# 1a[0,1]# 2#...
2.2 Numpy数据类型
Python支持的数据类型有整型、浮点型以及复数型,如下表所示(从教材中copy得来的):
每一种数据类型均有对应的类型转换函数
float64(42)# 42.0int8(42.0)#42bool(42)#Truecomplex(1)#1+0j
要注意复数不能转换为整数和浮点数
2.3 数据类型对象
数据类型对象是numpy.dtype类的实例。Numpys数组是有数据类型的,更确切地说,Numpy数组中的每一个元素均为相同的数据类型。数据类型对象可以给出单个数组元素在内存中占用的字节数,即dtype类的itemsize属性:
a.dtpye.itemsize# 8
3. 一维数组的索引和切片
一维数组的切片操作与Python列表的切片操作很相似。
a = np.arange(9)#array([0,1,2,3,4,5,6,7,8])a[3:7]#array([3,4,5,6])a[:7:2]#array([0,2,4,6])a[::-1]#array([8,7,6,5,4,3,2,1,0])
4.多维数组的切片和索引
多维数组的切片和索引与matlab中相关操作比较相似
#利用reshape函数创建一个多维数组b = np.arange(24).reshape(2,3,4)b.shape#(2,3,4)b#array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9,10,11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])b[0,0,0]#0b[:,0,0]#array([0,12])b[0]#b[0,:,:]/b(0,...)#array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9,10,11]])b[0,1]#array([4,5,6,7])b[0,1,::2]#array([4,6])
5.改变多维数组的维度
(1)ravel :对多维数组进行展平操作,返回一个展平后的一维数组,原始数组不变
b = np.arange(24).reshape(2,3,4)b#array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9,10,11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) c = b.ravel() c #array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]) b #array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9,10,11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])
(2)flatten: 功能与ravel函数相同(不过,flatten函数会请求分配内存来保存结果,而ravel函数只是返回数组的一个视图?)
d = b.flatten()d#array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])b #array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9,10,11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])
(3)用元组设置维度。除了可以用reshape函数,也可以直接使用一个正整数元组来设置数组的维度
b.shape(6,4)b#array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9,10,11], [12,13,14,15], [16,17,18,19], [20,21,22,23]])
(4)transpose:实现转置
一维数组的转置还是它本身
b.transpose()#array([[ 0, 4, 8, 12, 16, 20], [ 1, 5, 9, 13, 17, 21], [ 2, 6,10, 14, 18, 22], [ 3, 7,11, 15, 19, 23]])
(5)resize :与reshape的功能一样,不过reshape函数不会改变原始数组,resize则会改变
b.resize((2,12))b#array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12,13,14,15,16,17,18,19,20,21, 22, 23]])
6.数组的组合
Numpy数组有水平组合、垂直组合、深度组合等多种组合方式
(1)水平组合:hstack函数,concatenate函数
a = np.arange(9).reshape(3,3)a#array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])b = 2*ab#array([[ 0, 2, 4], [ 6, 8, 10], [12, 14,16]])np.hstack((a,b))#array([[ 0, 1, 2, 0, 2, 4], [ 3, 4, 5, 6, 8,10], [ 6, 7, 8,12,14,16]])#或者使用concatenate函数来实现np.concatenate((a,b),axis=1)
水平组合示意图
(2)垂直组合:vstack函数/concatenate函数
np.vstack((a,b))#array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 0, 2, 4], [ 6, 8,10], [12,14,16]])#也可以使用concatenate函数np.concatenate((a,b),axis=0)
(3)深度组合:dstack函数
np.dstack((a,b))#array([[[0, 0], [1, 2], [2, 4]], [[3, 6], [4, 8], [5,10]], [[6,12], [7,14], [8,16]]])
(4)列组合:column_stack
对于二位数组而言,列组合等价于水平组合
(5)行组合:row_stack
对于二位数组而言,行组合等价于垂直组合
7.数组的分割
(1)水平分割:hsplit/split
a = np.arange(9).reshape(3,3)np.hsplit(a,3)#[array([[0], [3], [6]]), array([[1], [4], [7]]), array([[2], [5], [8]])] #也可以使用split函数 np.split(a,3,axis=1)
(2)垂直分割:vsplit/split
np.vsplit(a,3)#[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]#也可以使用split函数np.split(a,3,axis=0)
(3)深度分割:dsplit
c = np.arange(27).reshape(3, 3, 3)c#array([[[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8]], [[ 9,10,11], [12,13,14], [15,16,17]], [[18,19,20], [21,22,23], [24,25,26]]])dsplit(c, 3)#[array([[[ 0], [ 3], [ 6]], [[ 9], [12], [15]], [[18], [21], [24]]]),array([[[ 1], [ 4], [ 7]], [[10], [13], [16]], [[19], [22], [25]]]),array([[[ 2], [ 5], [ 8]], [[11], [14], [17]], [[20], [23], [26]]])]
8.数组的属性
除了shape,dtype属性以外,数组还有其他属性:
(1)ndim属性,给出数组的维数,或者数组轴的数目
(2)size属性,给出数组中元素的总数目
(3)itemsize属性,给出数组中元素在内存中所占的字节数
(4)nbytes属性,给出整个数组在内存中所占的字节数
(5)T属性,给出数组的转置数组
9.数组的转换
(1)使用tolist函数可以将数组转换为列表
b = np.array([1+1j,3+2j])b.tolist()#[(1+1j),(3+2j)]
(2)astype函数可以改变数组的元素类型
b.astype('int')#array([1,2])
- 《numpy学习指南》学习笔记——数组
- 《numpy学习指南》学习笔记——常用函数
- Numpy 学习指南 学习笔记(一)
- Numpy学习笔记——Numpy基础
- Numpy学习笔记——NumPy模块
- NumPy学习指南 学习笔记(二) 常用函数
- numpy学习——数组性能比较
- Numpy学习笔记3-数组的运算
- Numpy学习笔记5-数组遍历方法
- 【python学习笔记】16:numpy数组四则运算
- 【python学习笔记】17:numpy数组排序
- Numpy学习笔记——常用函数
- Numpy学习笔记——便捷函数
- 《JAVA学习指南》学习笔记
- 【NumPy学习指南】day4 多维数组的切片和索引
- shell脚本学习指南--学习笔记
- 《Shell脚本学习指南》学习笔记
- 读《springMVC学习指南》学习笔记
- NYOJ 36-最长公共子序列
- java 浅克隆与深克隆
- Spring MVC 配置报错: Error creating bean with name 'userController': Injection of resource dependencies
- 知道这20个正则表达式,能让你少写1,000行代码
- linux实验楼学习笔记4
- 《numpy学习指南》学习笔记——数组
- Creating and using Clang plugin with Xcode
- [codeforces] Gym
- HDU1864最大报销额 ——01背包
- 二叉树详解
- 动态规划--多段图的最短路--单向TSp(Unidirectional TSP ,UVa 116)
- C++中值传递、指针传递、引用传递的总结
- 一、aapt的用法(上)
- 不相交集(并查集)