1.numpy

numpy和list的区别在于,numpy只能保存同类型数据,在list则可以保存不同类型的数据。numpy的底层是用C语言进行编写的,所以同样类型的函数,numpy的计算速度会高于同样功能的python函数。numpy中支持的数据类型主要有以下几种:

类型取值范围简写
np.boolTrue或Fasle(假设a是一个numpy的array数据类型为np.int16的变量,(a>5).dtype就是bool型。使用np.bool型也可以对数列进行过滤。‘b’
np.int8占1个字节的内存,取值范围从 -128到127(有符号整数)'i'
np.int16占2个字节的内存,取值范围从-32768到32767‘i2’
np.int32占4个字节的内存,取值范围从-2^31到2^31-1‘i4’
np.int64占8个字节的内存,取值范围从-2^63到2^36-1'i8'

np.uint8/np.uint16/

np.uint32/np.uint64

分别占1个、2个、4个、8个字节的内存,取值范围从0到 2^{8,16,32,64}-1

'u'\'u2'

\'u4'\'u8'

np.float16半精度浮点数:16位。其中1个符号位,5个指数位,10个精度位(这10个精度位应该表示的是小数位)‘f2’
np.float32单精度浮点数:32位。其中1个符号位,8个指数位,23个精度位‘f4’
np.float64双精度浮点数:64位。其中1个符号位,11个指数为,52个精度位‘f8’
np.complex64复数。分别用两个32位浮点数表示实部和虚部。(那就应该是占用8个字节)‘c8’
np.complex128复数。分别用两个64位浮点数表示实部和虚部。‘c16’
np.object_python对象‘O’
np.string_字符串‘S’
np.unicode_unicode类型‘U’

注意:类型之间是可以进行隐式转换的。其他非数值性的数据类型可能很少用到,就不深入研究了。

2.几个函数用法

2.1 reshape用法

reshape()函数中的order参数三种取值:order='C',默认值。当使用这种模式时,相当于行优先(最后一个索引优先变动)。order='F',在从第一个索引开始变动。order='A',则取决于数组在内存中的存储方式。

import numpy as np
a=np.arange(1,13).reshape(2,2,3)
print(a)
print("*"*25)
a_1=a.reshape((1,12))
print(a_1)
print("*"*25)
a_2=a.reshape((1,12),order='F')
print(a_2)
print("*"*25)
a_3=a.reshape((1,12),order='A')
print(a_3)

输出结果如下:

[[[ 1  2  3]
  [ 4  5  6]]
 [[ 7  8  9]
  [10 11 12]]]
*************************
[[ 1  2  3  4  5  6  7  8  9 10 11 12]]
*************************
[[ 1  7  4 10  2  8  5 11  3  9  6 12]]
*************************
[[ 1  2  3  4  5  6  7  8  9 10 11 12]]

2.2 np.append()函数用法

np.append(arr,values,axis=None)中,axis是可选参数。如果不设置axis,则np.append()返回的结果返回将arr和values展平再进行拼接。

import numpy as np
a=np.append([1,2,3],[4,5,6])
print(a)
print("*"*25)
a_1=np.append([1,2,3],[[4,5,6]])
print(a_1)
print("*"*25)
a_2=np.append([[1,2,3]],[4,5,6])
print(a_2)
print("*"*25)
a_3=np.append([[1,2,3]],[[[4,5,6]]])
print(a_3)
print("*"*25)
#a_4这种写法不会报错,但是a_4的数据类型从np.int类型变成了np.object
a_4=np.append([1,2,3],[[1],[2,3]])
print(a_4)

代码运行结果如下:

[1 2 3 4 5 6]
*************************
[1 2 3 4 5 6]
*************************
[1 2 3 4 5 6]
*************************
[1 2 3 4 5 6]
*************************
[1 2 3 list([1]) list([2, 3])]

当设置了axis参数后,情况就不一样了,下面先以二维数组为例: 

import numpy as np
a_1=np.append([[1,2,3],[4,5,6]],[[7,8,9]],axis=0)
print(a_1)
print("*"*25)
a_2=np.append([[1,2,3],[4,5,6]],[[10,12,14]],axis=0)
print(a_2)
print("*"*25)
a_3=np.append([[1,2,3],[4,5,6]],[[10,12],[11,13]],axis=1)
print(a_3)

代码运行结果如下:

[[1 2 3]
 [4 5 6]
 [7 8 9]]
*************************
[[ 1  2  3]
 [ 4  5  6]
 [10 12 14]]
*************************
[[ 1  2  3 10 12]
 [ 4  5  6 11 13]

从上面的实验结果可以发现。当axis=0的时候,arr和values则要求其在axis=1轴的维度相同(即具有相同的列)。当axis=1时,则要求arr和values在axis=0轴上维度相同(即具有相同的行数)。下面在来看看在三维矩阵上的情况。

import numpy as np
a=np.arange(4).reshape(2,2,1)
print(a)
print("*"*25)
a_1=np.append(a,[[[10],[12]]],axis=0)
#value的维度必须满足(任意,3,1)才能添加到a的后面
print(a_1)
print("*"*25)
a_2=np.append(a,[[[14]],[[15]]],axis=1)
#value的维度必须满足(2,任意,1)才能添加到a的后面
print(a_2)
print("*"*25)
a_3=np.append(a,[[[20,21],[22,23]],[[26,27],[28,29]]],axis=2)
#value的维度必须满足(2,3,任意)才能添加到a的后面
print(a_3)

代码运行结果如下:

[[[0]
  [1]]
 [[2]
  [3]]]
*************************
[[[ 0]
  [ 1]]
 [[ 2]
  [ 3]]
 [[10]
  [12]]]
*************************
[[[ 0]
  [ 1]
  [14]]
 [[ 2]
  [ 3]
  [15]]]
*************************
[[[ 0 20 21]
  [ 1 22 23]]
 [[ 2 26 27]
  [ 3 28 29]]]

2.3 np.insert()函数用法

np.insert(arr,obj,values,axis)和np.append()用法类似,但np.insert()的用法更灵活。np.append()新增的数据只能在每行每列的最后,其位置是规定的。而np.insert()添加的位置是可以指定的(由参数obj确定)。np.insert()中的axis的作用于np.append()中的作用相同,但其在进行插入的时候,对arr和values的维度不再有限制。

先看看obj对结果的影响。(注意,obj可以是int型、序列或者切片)

a=np.array([[1,2],[3,4],[5,6]])
print(a)
print("*"*25)
a_1=np.insert(a,3,[1])#不加axis时,数据进行展开构成一维数组
print(a_1)
print("*"*25)
a_2=np.insert(a,2,7,axis=0)
print(a_2)
print("*"*25)
a_3=np.insert(a,[2,2],7,axis=0)
print(a_3)
print("*"*25)
a_4=np.insert(a,[2,0],7,axis=0)
print(a_4)

 代码运行结果如下。从运行结果中可以发现,obj的取值范围是0到len.shape[axis]。

[[1 2]
 [3 4]
 [5 6]]
*************************
[1 2 3 1 4 5 6]
*************************
[[1 2]
 [3 4]
 [7 7]
 [5 6]]
*************************
[[1 2]
 [3 4]
 [7 7]
 [7 7]
 [5 6]]
*************************
[[7 7]
 [1 2]
 [3 4]
 [7 7]
 [5 6]]

 再来看看values的形式对结果的影响。从以下代码可以看出,np.insert()对arr和values的形式更灵活

a=np.array([[1,2],[3,4],[5,6]])
print(a)
print("*"*25)
a_1=np.insert(a,2,[1],axis=1)
print(a_1)
print("*"*25)
a_2=np.insert(a,2,1,axis=1)
print(a_2)
print("*"*25)
a_3=np.insert(a,2,[1,2,3],axis=1)
print(a_3)
print("*"*25)
a_4=np.insert(a,2,[[1,3,9]],axis=1)
print(a_4)

代码运行结果如下:

[[1 2]
 [3 4]
 [5 6]]
*************************
[[1 2 1]
 [3 4 1]
 [5 6 1]]
*************************
[[1 2 1]
 [3 4 1]
 [5 6 1]]
*************************
[[1 2 1]
 [3 4 2]
 [5 6 3]]
*************************
[[1 2 1]
 [3 4 3]
 [5 6 9]]

2.3 np.delete()

np.delete(arr,obj,asix)函数实现按照axis和obj对arr进行元素删除的功能。如果没有设置axis,则对arr进行flatten之后再删除。

import numpy as np
a=np.arange(12).reshape(2,2,3)
print(a)
print("*"*25)
a_1=np.delete(a,1,axis=0)
print(a_1)
print("*"*25)
a_2=np.delete(a,1,axis=1)
print(a_2)
print("*"*25)
a_3=np.delete(a,1,axis=2)
print(a_3)
print("*"*25)
a_4=np.delete(a,1)
print(a_4)
print("*"*25)
a_5=np.delete(a,slice(2,5))
print(a_5)
print("*"*25)
a_6=np.delete(a,[2,6])
print(a_6)

代码运行结果如下:

[[[ 0  1  2]
  [ 3  4  5]]
 [[ 6  7  8]
  [ 9 10 11]]]
*************************
[[[0 1 2]
  [3 4 5]]]
*************************
[[[0 1 2]]
 [[6 7 8]]]
*************************
[[[ 0  2]
  [ 3  5]]
 [[ 6  8]
  [ 9 11]]]
*************************
[ 0  2  3  4  5  6  7  8  9 10 11]
*************************
[ 0  1  5  6  7  8  9 10 11]
*************************
[ 0  1  3  4  5  7  8  9 10 11]
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐