09-python-numpy-ndarray
9. NumPy之:ndarray多维数组操作
简介
NumPy一个非常重要的作用就是可以进行多维数组的操作,多维数组对象也叫做ndarray。我们可以在ndarray的基础上进行一系列复杂的数学运算。
本文将会介绍一些基本常见的ndarray操作,大家可以在数据分析中使用。
创建ndarray
创建ndarray有很多种方法,我们可以使用np.random来随机生成数据:
import numpy as np
# Generate some random data
data = np.random.randn(2, 3)
dataarray([[ 0.0929, 0.2817, 0.769 ],
[ 1.2464, 1.0072, -1.2962]])除了随机创建之外,还可以从list中创建:
data1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(data1)array([6. , 7.5, 8. , 0. , 1. ])从list中创建多维数组:
使用np.zeros创建初始值为0的数组:
创建2维数组:
使用empty创建3维数组:
注意,这里我们看到empty创建的数组值为0,其实并不是一定的,empty会从内存中随机挑选空间来返回,并不能保证这些空间中没有值。所以我们在使用empty创建数组之后,在使用之前,还要记得初始化他们。
使用arange创建范围类的数组:
指定数组中元素的dtype:
ndarray的属性
可以通过data.shape获得数组的形状。
通过ndim获取维数信息:
可以通过data.dtype获得具体的数据类型。
ndarray中元素的类型转换
在创建好一个类型的ndarray之后,还可以对其进行转换:
上面我们使用astype将int64类型的ndarray转换成了float64类型的。
如果转换类型的范围不匹配,则会自动进行截断操作:
注意,这里是把小数截断,并没有向上或者向下取整。
ndarray的数学运算
数组可以和常量进行运算,也可以和数组进行运算:
数组之间还可以进行比较,比较的是数组中每个元素的大小:
index和切片
基本使用
先看下index和切片的基本使用,index基本上和普通数组的使用方式是一样的,用来访问数组中某一个元素。
切片要注意的是切片后返回的数组中的元素是原数组中元素的引用,修改切片的数组会影响到原数组。
index with slice
slice还可以作为index使用,作为index使用表示的就是一个index范围值。
作为index表示的slice可以有多种形式。
有头有尾的,表示index从1开始到6-1结束:
无头有尾的,表示index从0开始,到尾-1结束:
有头无尾的,表示从头开始,到所有的数据结束:
boolean index
index还可以使用boolean值,表示是否选择这一个index的数据。
我们先看下怎么构建一个boolean类型的数组:
上面我们通过比较的方式返回了一个只包含True和False的数组。
这个数组可以作为index值来访问数组:
在索引行的时候,还可以索引列:
可以用 ~符号来取反:
我们可以通过布尔型数组设置值,在实际的项目中非常有用:
Fancy indexing
Fancy indexing也叫做花式索引,它是指使用一个整数数组来进行索引。
举个例子,我们先创建一个 8 * 4的数组:
然后使用一个整数数组来索引,那么将会以指定的顺序来选择行:
还可以使用负值来索引:
花式索引还可以组合来使用:
上面我们构建了一个8 * 4的数组。
然后取他们的第2列的第一个值,第6列的第三个值等等。最后得到一个1维的数组。
数组变换
我们可以在不同维度的数组之间进行变换,还可以转换数组的轴。
reshape方法可以将数组转换成为任意的形状:
数组还提供了一个T命令,可以将数组的轴进行对调:
对于高维数组,可以使用transpose来进行轴的转置:
上面的transpose((1, 0, 2)) 怎么理解呢?
其含义是将x,y轴对调,z轴保持不变。
上面我们通过使用reshape((2, 2, 4))方法创建了一个3维,也就是3个轴的数组。 其shape是 2 * 2 * 4 。
先看下对应关系:
(0,0)-》 [ 0, 1, 2, 3]
(0,1)-》 [ 4, 5, 6, 7]
(1,0)-》 [ 8, 9, 10, 11]
(1,1)-》 [12, 13, 14, 15]
转换之后:
(0,0)-》 [ 0, 1, 2, 3]
(0,1)-》 [ 8, 9, 10, 11]
(1,0)-》[ 4, 5, 6, 7]
(1,1)-》 [12, 13, 14, 15]
于是得到了我们上面的的结果。
多维数组的轴转换可能比较复杂,大家多多理解。
还可以使用 swapaxes 来交换两个轴,上面的例子可以重写为:
本文已收录于 www.flydean.com
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
最后更新于
这有帮助吗?