numpy的基础操作1

参考教程

系列视频:https://www.bilibili.com/video/av11263377

本文的知识点将只包括numpy数据的基础使用方法,将会涉及到如下内容:

  1. numpy ndarry基本数组的生成
  2. 数组深浅拷贝
  3. 数组的基本形状改变
  4. 指定维度上的计算
  5. 不同shape也可以运算的操作
  6. 数组的增删操作
  7. Mask array的一些特性
  8. 小数数组打印的技巧

不过本文是属于查漏补缺性质的,重点在那些容易忽略的地方,而那些大多数人都知道的部分就不会再细写了。

linspace函数的使用(数组初始化)

之前的工作中,创建numpy的数组我一直都习惯用arange、zeros、ones这几个函数,而对linspace这个函数却不是很熟悉。linspace与arange的作用有些相似,都能生成等间隔的数组,但是两者有如下区别:

  1. 需要固定步长用arange,而需要固定生成数目的个数用linspace,因为linspace会自动计算步长,设置retstep参数可以返回计算的步长
  2. arange生成的数组不包endpoint的值,而linspace则包含
1
np.linspace(0, 15, 5, retstep=True)

view和copy(浅拷贝与深拷贝)

view时浅拷贝,copy时深拷贝,在我的一般使用中只用copy就可以满足了,不过其实view也有比较好的应用场景,如同一数组希望用不同维度不同的类型的形式使用,下面代码,arr_v2是arr_v1的view,但是在使用Ⅹ不仅将其纬度改变了还将其元素类型也改变了,对arr_v2的修改会影响arr_v1:

1
2
3
4
5
arr_v1 = np.array([1,5,10,15,20,25])
arr_v2 = arr_v1.view()
arr_v2.shape = (2,3)
arr_v2.dtype = np.int8
arr_v2[2,2] =255

修改reshape

1. reshape

shape相关的函数最常用的就是reshape了,但是注意:reshape函数是view而不是copy

2. ravel函数和flat属性

ravel将多维数组转为一个一维数组, flat属性则提供是一个迭代器顺序读取数组,使用代码如下:

1
2
3
4
5
6
# ravel
orig_arr = np.arange(12).reshape(2,2,3)
new_arr = orig_arr.ravel()
# flat
for i in orig_arr.flat:
print(i)

指定操作的维度

默认的sum、mean等操作是对数组中所有的元素进行对应的计算,如果只希望在某一个维度上或者几个维度上操作则需要设置其axis参数:

1
2
3
4
arr1 = np.arange(12).reshape((2,2,3))
print(arr1.mean())
print(arr1.mean(axis=0))
print(arr1.mean(axis=(0,1)))

shape不同的array计算

多维数组之间的运算一般都要求参与运算的array的shape要保持一致,但是也有一些运算没有这样的限制:

  1. 矩阵乘法:矩阵的乘法需要用dot函数,满足矩阵乘法的要求即可
  2. 参与运算的一个数组的shape是其中另一个数组shape的一部分
1
2
3
arr1 = np.arange(12).reshape((2,6))
arr2 = np.arange(0,6)
arr1 / arr2

添加和删减数组成员

这一部分对于我个人来说是最不熟悉的,因为在一般情况下创建新的数组然后赋值,同样也可以达到添加和删减的效果。只不过有时候赋值操作需要使用for循环来实现而无法直接完成,这个时候使用numpy数组提供的添加和删除操作就方便多了。

1. append操作

append操作原数组不变,返回的数组将变成一维,然后再后面追加元素:

1
2
orig_arr = np.arange(12).reshape(2,2,3)
ap_arr = np.append(orig_arr, [100,100])

append也可以沿着这某一个维度添加:

1
2
3
orig_arr = np.arange(12).reshape(2,2,3)
orig_arr1 = np.arange(112,124).reshape(2,2,3)
np.append(orig_arr, orig_arr1, axis=2)

2. hstack操作

与append在axis设置为1时是一样的:

1
2
3
4
orig_arr = np.arange(12).reshape(2,2,3)
orig_arr1 = np.arange(112,124).reshape(2,2,3)
ret_arr = np.hstack((orig_arr,orig_arr1))
ret_arr, ret_arr.shape

3. insert操作

insert操作实际上也是重新生成一个新的数组,它于append的区别是,append只能够再尾部添加,而insert能够指定位置添加,insert也可以指定纬度:

1
2
ins_arr = np.insert(orig_arr, 1, 666)
ins_arr = np.insert(orig_arr, (1,2), 666, axis=2)

4. delete操作

同上delete是新生成数组而不是再原数组上删除,delete可以删除指定位置的元素,多维数组删除一个元素会退化为一维,也可以可以在指定纬度上的数据:

1
2
del_arr = np.delete(orig_arr, 1)
del_arr = np.delete(orig_arr, 1, axis=1)

Mask Array

虽然mask数组在实际工作使用中得很多,但是有些细节还是不是很清楚,所以这里会注重一些使用中没有关注到的细节。

1. 运算优先级

mask数组一般由关系运算得到,对于很多关系运算符需要注意得是其运算优先级,生成的mask与原数组同shape

1
2
nd_arr = np.arange(36).reshape((3,4,3))
ma_ndarr = nd_arr % 5 == 0

2. 作为引索使用

使用mask可以得到子数组,但是多维数组在用mask引索得到得子数组是一维的:

3. 多个mask联合

可以多个mask联合使用,需要使用相应的逻辑运算函数:

1
2
3
4
arr = np.arange(10)
ma_arr1 = arr % 3 == 0
ma_arr2 = arr > 5
comb_ma = np.logical_and(ma_arr1, ma_arr2)

使用set_printoptions函数设置打印格式

在打印计算的结果的时候,最常见的一个问题是结果过小,显示的数字太长,不方便阅读,可以使用set_printoptions的precision参数设置显示精度,除此之外set_printoptions还有更多的设置:

1
2
np.set_printoptions(precision=6)
print(arr1/7)
Compartir