根据《利用python进行数据分析》和原博文https://www.jianshu.com/p/a380222a3292个人使用学习笔记
Numpy基础:数组和矢量计算
Numpy的ndarray:一种多维数组对象
特点:快速灵活,同种类型
属性:ndim, shape(维度),dtype(数据类型)
创建ndarray
- array函数:接受一切序列型对象(包括其他数组)产生一个NumPy数组

数据类型
- 常用类型


- astype转换类型
In [38]: arr.dtype
Out[38]: dtype('int64')
In [39]: float_arr = arr.astype(np.float64)
In [40]: float_arr.dtype
Out[40]: dtype('float64')
# 字符串
In [44]: numeric_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_)
In [45]: numeric_strings.astype(float)
Out[45]: array([ 1.25, -9.6 , 42. ])</pre>
调用astype总会创建一个新的数组(一个数据的备份),即使新的dtype与旧的dtype相同
Numpy数组的运算
数组使不用编写循环即可对数据执行批量运算,NumPy用户称其为矢量化(vectorization)。大小相等的数组之间的任何算术运算都会将运算应用到元素级(类似R),不同大小的数组之间的运算叫做广播(broadcasting)
索引
切片索引
当你将一个标量值赋值给一个切片时(如arr[5:8]=12),该值会自动传播(也就说后面将会讲到的“广播”)到整个选区。
跟列表最重要的区别在于,数组切片是原始数组的视图。这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上。
如果你想要得到的是ndarray切片的一份副本而非视图,就需要明确地进行复制操作,例如arr[5:8].copy()。
In [74]: arr2d[0][2]
Out[74]: 3
# 等价
In [75]: arr2d[0, 2]
Out[75]: 3
布尔值索引
In [102]: names == 'Bob'
Out[102]: array([ True, False, False, True, False, False, False], dtype=bool)
In [103]: data[names == 'Bob']
Out[103]:
array([[ 0.0929, 0.2817, 0.769 , 1.2464],
[ 1.669 , -0.4386, -0.5397, 0.477 ]])
数组的比较运算(如==)是矢量化的。对names和字符串"Bob"的比较运算将会产生一个布尔型数组,可以用于数组索引,布尔型数组的长度必须跟被索引的轴长度一致
~反转条件,!=不等于也很常用,Python关键字and和or在布尔型数组中无效,要使用&与|
通过布尔型索引选取数组中的数据,将总是创建数据的副本
花式索引
In [119]: arr
Out[119]:
array([[ 0., 0., 0., 0.],
[ 1., 1., 1., 1.],
[ 2., 2., 2., 2.],
[ 3., 3., 3., 3.],
[ 4., 4., 4., 4.],
[ 5., 5., 5., 5.],
[ 6., 6., 6., 6.],
[ 7., 7., 7., 7.]])
In [120]: arr[[4, 3, 0, 6]]
Out[120]:
array([[ 4., 4., 4., 4.],
[ 3., 3., 3., 3.],
[ 0., 0., 0., 0.],
[ 6., 6., 6., 6.]])
In [124]: arr[[1, 5, 7, 2], [0, 3, 1, 2]]
Out[124]: array([ 4, 23, 29, 10])
花式索引跟切片不一样,总是将数据复制到新数组中
转置.T
通用函数ufunc
通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。有些ufunc可以返回多个数组



数组进行数据处理
NumPy数组使你可以将许多种数据处理任务表述为简洁的数组表达式(否则需要编写循环)。用数组表达式代替循环的做法,通常被称为矢量化。一般来说,矢量化数组运算要比等价的纯Python方式快上一两个数量级(甚至更多),尤其是各种数值计算。
条件逻辑
numpy.where函数是三元表达式x if condition else y的矢量化版本
In [170]: result = np.where(cond, xarr, yarr)
In [175]: np.where(arr > 0, 2, -2)
Out[175]:
array([[-2, -2, -2, -2],
[ 2, 2, -2, 2],
[ 2, 2, 2, -2],
[ 2, -2, 2, 2]])
In [176]: np.where(arr > 0, 2, arr)
Out[176]:
array([[-0.5031, -0.6223, -0.9212, -0.7262],
[ 2. , 2. , -1.1577, 2. ],
[ 2. , 2. , 2. , -0.9975],
[ 2. , -0.1316, 2. , 2. ]])
数学统计方法


布尔型数组方法
sum经常被用来对布尔型数组中的True值计数
any用于测试数组中是否存在一个或多个True
all则检查数组中所有值是否都是True
所有非0元素将会被当做True。
排序sort
In [199]: arr = np.random.randn(5, 3)
In [200]: arr
Out[200]:
array([[ 0.6033, 1.2636, -0.2555],
[-0.4457, 0.4684, -0.9616],
[-1.8245, 0.6254, 1.0229],
[ 1.1074, 0.0909, -0.3501],
[ 0.218 , -0.8948, -1.7415]])
In [201]: arr.sort(1)
In [202]: arr
Out[202]:
array([[-0.2555, 0.6033, 1.2636],
[-0.9616, -0.4457, 0.4684],
[-1.8245, 0.6254, 1.0229],
[-0.3501, 0.0909, 1.1074],
[-1.7415, -0.8948, 0.218 ]])
唯一化及其他的集合逻辑
np.unique用于找出数组中的唯一值并返回已排序的结果
np.in1d用于测试一个数组中的值在另一个数组中的成员资格,返回一个布尔型数组
In [208]: ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])
In [209]: np.unique(ints)
Out[209]: array([1, 2, 3, 4])
# 普通代码
In [210]: sorted(set(names))
Out[210]: ['Bob', 'Joe', 'Will']
In [211]: values = np.array([6, 0, 0, 3, 2, 5, 6])
In [212]: np.in1d(values, [2, 3, 6])
Out[212]: array([ True, False, False, True, True, False, True], dtype=bool)

用于数组的文件输入输出
np.save和np.load是读写磁盘数组数据的两个主要函数。默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中的。
通过np.savez可以将多个数组保存到一个未压缩文件中,将数组以关键字参数的形式传入即可
In [213]: arr = np.arange(10)
In [214]: np.save('some_array', arr)
In [215]: np.load('some_array.npy')
Out[215]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])</pre>
线性代数numpy.linalg
x.dot(y)等价于np.dot(x, y)
numpy.linalg中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西

伪随机数生成numpy.random
numpy.random模块对Python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数。
用NumPy的np.random.seed更改随机数生成种子
