機器學習中的數學(2):numpy中切片、行列向量,奇異值分解

1.ndarray數組維度-橫向量和列向量

a = array([1,2,3])    #一維列向量
print(a.shape, a)
b = array([[1,2,3]])    #二維橫向量
print(b.shape, b)

(3,) [1 2 3]
(1, 3) [[1 2 3]]

{關於numpy數組維度表示上的區別,numpy多維數組橫向量和列向量的區別}

zeros([5,])    #返回的是一維列向量
[ 0.  0.  0.  0.  0.]
#等價於這樣的矩陣(一維數組),zeros([5])、zeros(5)以及zeros(5,)
zeros([5, 1])    #返回的是二維列向量
[[ 0.]
 [ 0.]
 [ 0.]
 [ 0.]
 [ 0.]]
zeros([1, 5])    #二維橫向量
[[ 0.  0.  0.  0.  0.]]


a = array([1,2,3])    #一維列向量
print(a.shape, a)
b = array([[1,2,3]])    #二維橫向量
print(b.shape, b)

(3,) [1 2 3]
(1, 3) [[1 2 3]]

Note:a=np.array([1,2,3]) 由 a.shape知道a是一個列向量,而b=np.array([[1,2,3]])是一個橫向量。

b=arange(1,5)   #列向量
print(b.shape, b)
a=array([[1,2,3,4]])#橫向量
print(a.shape, a)
print(a+b)

(4,) [1 2 3 4]
(1, 4) [[1 2 3 4]]
[[2 4 6 8]]

Note:
1. 上面的例子沒有說明的,數值就是原來的,沒有變。比較上面知道,基本上橫向量和列向量是可以任意加減的。但是其他的要有一樣的shape纔可以。
2.一維列向量的轉置還是本身。
3. 一維列向量(如(3,))在廣播運算中是當做二維行向量(如(1,3))計算的。也就是說(3,)相當於(1,3)。

2.array元素存取

元素存取的不同方式

下標範圍存取元素

結束索引在這兒是不被包含的!和python中的list的索引相同!但是不同於pandas中的索引是被包含的!!!

數組元素的存取方法和Python的標準方法相同:

>>> a = np.arange(10)
>>> a[5]    # 用整數作爲下標可以獲取數組中的某個元素
5
>>> a[3:5]  # 用範圍作爲下標獲取數組的一個切片,包括a[3]不包括a[5]
array([3, 4])
>>> a[:5]   # 省略開始下標,表示從a[0]開始
array([0, 1, 2, 3, 4])
>>> a[:-1]  # 下標可以使用負數,表示從數組後往前數
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
>>> a[2:4] = 100,101    # 下標還可以用來修改元素的值
>>> a
array([  0,   1, 100, 101,   4,   5,   6,   7,   8,   9])
>>> a[1:-1:2]   # 範圍中的第三個參數表示步長,2表示隔一個元素取一個元素
array([  1, 101,   5,   7])
>>> a[::-1] # 省略範圍的開始下標和結束下標,步長爲-1,整個數組頭尾顛倒
array([  9,   8,   7,   6,   5,   4, 101, 100,   1,   0])
>>> a[5:1:-2] # 步長爲負數時,開始下標必須大於結束下標
array([  5, 101])

numpy數組下標是可以越界的!

b
array([1, 2, 3, 4, 5, 6])
b[1:30309]
array([2, 3, 4, 5, 6])
如果越界了,會自動檢測,只返回到結尾的數據。

和Python的列表序列不同,通過下標範圍獲取的新的數組是原始數組的一個視圖,它與原始數組共享同一塊數據空間。

>>> b = a[3:7] # 通過下標範圍產生一個新的數組b,b和a共享同一塊數據空間
>>> b
array([101,   4,   5,   6])
>>> b[2] = -10 # 將b的第2個元素修改爲-10
>>> b
array([101,   4, -10,   6])
>>> a # a的第5個元素也被修改爲10
array([  0,   1, 100, 101,   4, -10,   6,   7,   8,   9])

除了使用下標範圍存取元素之外,NumPy還提供了兩種存取元素的高級方法。

3.使用整數序列

當使用整數序列對數組元素進行存取時,將使用整數序列中的每個元素作爲下標,整數序列可以是列表或者數組。使用整數序列作爲下標獲得的數組不和原始數組共享數據空間。

>>> x = np.arange(10,1,-1)
>>> x
array([10,  9,  8,  7,  6,  5,  4,  3,  2])
>>> x[[3, 3, 1, 8]] # 獲取x中的下標爲3, 3, 1, 84個元素,組成一個新的數組;python自帶的list不能這麼做
array([7, 7, 9, 2])
>>> b = x[np.array([3,3,-3,8])]  #下標可以是負數
>>> b[2] = 100
>>> b
array([7, 7, 100, 2])
>>> x   # 由於b和x不共享數據空間,因此x中的值並沒有改變
array([10,  9,  8,  7,  6,  5,  4,  3,  2])
>>> x[[3,5,1]] = -1, -2, -3 # 整數序列下標也可以用來修改元素的值
>>> x
array([10, -3,  8, -1,  6, -2,  4,  3,  2])
發佈了67 篇原創文章 · 獲贊 22 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章