python:numpy的数据类型及append()、insert()、delete()函数的使用方法
1.numpynumpy和list的区别在于,numpy只能保存同类型数据,在list则可以保存不同类型的数据。numpy的底层是用C语言进行编写的,所以同样类型的函数,numpy的计算速度会高于同样功能的python函数。numpy中支持的数据类型主要有以下几种:类型取值范围简写np.boolTrue或Fasle(假设a是一个numpy的array数据类型为...
1.numpy
numpy和list的区别在于,numpy只能保存同类型数据,在list则可以保存不同类型的数据。numpy的底层是用C语言进行编写的,所以同样类型的函数,numpy的计算速度会高于同样功能的python函数。numpy中支持的数据类型主要有以下几种:
类型 | 取值范围 | 简写 |
---|---|---|
np.bool | True或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] |
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)