數據科學包——初識numpy(索引、合併、拷貝)

五、索引

1.簡單索引

image

1.1 一維數組

data = np.arange(100, step=10)
data
>>>
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
data[1:5]
>>>
array([10, 20, 30, 40])
data[4:]
>>>
array([40, 50, 60, 70, 80, 90])
data[:4]
>>>
array([ 0, 10, 20, 30])

1.2 二維數組

data = np.arange(16).reshape(4, 4)
data
>>>
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
data[1:3]
>>>
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
data[1:]
>>>
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
data[1:3, 1:3]
>>>
array([[ 5,  6],
       [ 9, 10]])
data[:, 1:3]
>>>
array([[ 1,  2],
       [ 5,  6],
       [ 9, 10],
       [13, 14]])

2.數組作爲索引

data = np.arange(16).reshape(4,4)
data
>>>
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
data[[0, 2, 3], [1, 2, 3]]
>>>
array([ 1, 10, 15])

對應座標(0,1)(2,2)(3,3)

print (data[0,1], data[2,2], data[3,3])
>>>
1 10 15

xidx = np.array([0, 2, 3])
yidx = np.array([1, 2, 3])
data[xidx, yidx]
>>>
array([ 1, 10, 15])
# 修改每行裏的特定列的數據
yidx = [0, 3, 2, 0]
data[np.arange(4), yidx] += 100
data
>>>
array([[100,   1,   2,   3],
       [  4,   5,   6, 107],
       [  8,   9, 110,  11],
       [112,  13,  14,  15]])

3.bool 索引

image

data = np.arange(16).reshape(4,4)
data
>>>
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
idx = data >= 10
idx
>>>
array([[False, False, False, False],
       [False, False, False, False],
       [False, False,  True,  True],
       [ True,  True,  True,  True]], dtype=bool)
data[idx]
>>>
array([10, 11, 12, 13, 14, 15])
# 輸出是元素線性化後的結果
data[data >= 10]
>>>
array([10, 11, 12, 13, 14, 15])
# 偶數元素
data[data % 2 == 0]
>>>
array([ 0,  2,  4,  6,  8, 10, 12, 14])

4.廣播特性

image

a=np.array([[[1,2,3],[4,5,6]],[[1,2,3],[2,4,5]]])
a
>>>
array([[[1, 2, 3],
        [4, 5, 6]],

       [[1, 2, 3],
        [2, 4, 5]]])
a + 2 #類似於上圖1
>>>
array([[[3, 4, 5],
        [6, 7, 8]],

       [[3, 4, 5],
        [4, 6, 7]]])
c = np.random.random((1,3))
c

a + c #維度(2,2,3)和(1,3)的array相加,基於廣播特性,最後得到維度(2,2,3)的array

a+c
>>>
array([[[1.14365424, 2.62859846, 3.01655191],
        [4.14365424, 5.62859846, 6.01655191]],

       [[1.14365424, 2.62859846, 3.01655191],
        [2.14365424, 4.62859846, 5.01655191]]])

六、合併與分割

1.合併

1.1 vstack,hstack

a=np.array([1,1,1])
b=np.array([2,2,2])
c=np.vstack((a,b))#上下合併
d=np.hstack((a,b))#左右合併
c
>>>
array([[1, 1, 1],
       [2, 2, 2]])
d
>>>
array([1, 1, 1, 2, 2, 2])

1.2 concatenate

concatenate((a1, a2, …), axis=0) #數組拼接函數 
  • 參數:
    a1,a2……:爲要拼接的數組
    axis:在哪個維度上進行拼接,默認爲0
a=np.array([[1,1,1]])
b=np.array([[2,2,2]])
np.concatenate((a,b), axis=0) 
>>>
array([[1, 1, 1],
       [2, 2, 2]])
       
np.concatenate((a,b), axis=1)    
>>>
array([[1, 1, 1, 2, 2, 2]])

1.3 增加維度

a.shape
>>>
(3,)

print(a[np.newaxis,:].shape)#行上加一個維度
>>>
(1, 3)

print(a[:,np.newaxis].shape)#縱向上加一個維度
>>>
(3, 1)

2.分割

2.1 split 平均分割

a=np.arange(12).reshape((3,4))
a
>>>
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

print(np.split(a,2,axis=1)) #縱向分割,平分成兩個部分,不能不平均分割
>>>
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]

2.2 array_split 不均等分割

print(np.array_split(a,3,axis=1)) 
>>>
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2],
       [ 6],
       [10]]), array([[ 3],
       [ 7],
       [11]])]

2.3 vsplit,hsplit

print(np.vsplit(a,3) )#縱向分三塊
>>>
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]

print(np.hsplit(a,3) )#橫向分三塊
>>>
ValueError: array split does not result in an equal division

print(np.hsplit(a,3) )#橫向分兩塊
>>>
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]

七、拷貝

1.無拷貝

簡單的複製操作不會產生對象的複製操作。

a=np.arange(4)
b=a
b.shape=(2,2)
a.shape
>>>
(2,2)

2. 淺拷貝

view操作,如numpy的slice,只會copy父對象,不會copy底層的數據,共用原始引用指向的對象數據。如果在view上修改數據,會直接反饋到原始對象。

a=np.arange(4)
b=a
b.shape=(2,2)
id(a)
>>>
2245541785648

c = a.view()#c的引用地址變化了
id(c)
>>>
2245541787408

c.shape =(2,2)  #a.shape不變,但是修改c的數據會導致a的數據也會變化
a.shape
>>>
(4,)

c[0]=999
a
>>>
array([999, 999,   2,   3])

c
>>>
array([[999, 999],
       [  2,   3]])

3. 深拷貝

對對象及其子對象都進行copy一份,對新生成的對象修改刪除操作不會影響到原對象。

a = np.arange(4)
b=a #對象複製,a,b地址一樣
b.shape =(2,2)#a對象的shape也會變化
id(a),id(b)
>>>
(2245541788288, 2245541788288)
 
d = a.copy()  #deep copy
id(d)
>>>
2245541848128

#對象修改刪除操作不會影響到原對象
d[0]=9
d
>>>
array([[9, 9],
       [2, 3]])
a
>>>
array([[0, 1],
       [2, 3]])

摘自:https://blog.csdn.net/genghaihua/article/details/92806584

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