Learning Notes on numpy
Reference: NumPy-快速处理数据
1.标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3]
,需要有3个指针和三个整数对象。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间。
Python还提供了一个array模块,array对象和列表不同,它直接保存数值,和C语言的一维数组比较类似。但是由于它不支持多维,也没有各种运算函数,因此也不适合做数值运算。
2.Numpy traps and pitfalls:
1).reshape()返回的新数组与原数组共享数据空间
1 | import numpy as np |
[1 2 3 4]
[[1 2]
[3 4]]
1 | a[1] = -1 |
[ 1 -1 3 4]
[[ 1 -1]
[ 3 4]]
数组a和b其实共享数据存储内存区域,因此修改其中任意一个数组的元素都会同时修改另外一个数组的内容
2).切片操作返回的新数组与原数组共享数据空间
1 | a = np.arange(10) |
[0 1 2 3 4 5 6 7 8 9]
[3 4 5 6]
1 | a[5] = -1 |
[ 0 1 2 3 4 -1 6 7 8 9]
[ 3 4 -1 6]
和Python的list数据类型不同,在numpy中通过下标范围(切片)获取的新的数组是原始数组的一个视图,它与原始数组共享同一块数据空间。
3).使用整数序列作为下标获得的数组不和原数组共享数据空间
1 | arr = np.arange(10) |
[0 1 2 3 4 5 6 7 8 9]
[1 2 1 9]
[1 2 1 9]
[0 1 2 3 4 5 6 7 8 9]
[ 1 -10 1 9]
[1 2 1 9]
[ 0 -1 2 -3 4 -5 6 7 8 9]
[ 1 -10 1 9]
[1 2 1 9]
4).使用布尔数组作为下标获得的数组不和原数组共享数据空间,注意这种方式只能使用布尔数组(numpy.ndarray),不能使用布尔列表(list)
1 | arr = np.arange(5) |
[0 1 2 3 4]
[0 2]
[0 2]
[1 0 1 0 0]
布尔数组一般不是手工产生,而是使用布尔运算的ufunc函数产生
1 | # 产生一个长度为5,元素值为0-1的随机数的数组 |
[ 0.30882553 0.62608515 0.97691458 0.79139355 0.54452488]
[False True True True True]
[ 0.62608515 0.97691458 0.79139355 0.54452488]