python:numpy的數據類型及append()、insert()、delete()函數的使用方法

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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章