Numpy学习笔记

根据《利用python进行数据分析》和原博文https://www.jianshu.com/p/a380222a3292个人使用学习笔记

Numpy基础:数组和矢量计算

Numpy的ndarray:一种多维数组对象

  • 特点:快速灵活,同种类型

  • 属性:ndim, shape(维度),dtype(数据类型)

创建ndarray

  • array函数:接受一切序列型对象(包括其他数组)产生一个NumPy数组
img

数据类型

  • 常用类型
img

img
  • 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可以返回多个数组

img
img
img

数组进行数据处理

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.    ]])

数学统计方法

img

img

布尔型数组方法

  • 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)
img

用于数组的文件输入输出

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中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西

img

伪随机数生成numpy.random

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

用NumPy的np.random.seed更改随机数生成种子

img
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容