4.numpy包(上)

NumPy包的使用(上)

1. ndarray

ndarray 是NumPy中array類,用於處理多維數組,也成爲array,
但是ndarray和array.array是不一樣的。這個需要進行區分。

2. ndarray對象屬性

ndarray對象有下面幾個屬性:
ndim: ndarray的軸的個數,或者是維度
shape: ndarray的形狀,如果是二維的話,比如如果是2行三列的話,那麼shape=(2,3)
size: ndarray中所有的元素的個數,同時也是shape的每個元素的乘積
dtype: 元素的類型。
itemsize:  元素的大小

3. 如何創建array

  • 可以通過list或者是tuple進行創建,使用np.array函數
a = np.array([1,2,3])       # array自動推導出dtype=np.int64
b = np.array((1.0,2.0,3.0)) # array會自動推導出dtype=np.float64    
c = np.array(((1,2),(3,4))) #創建二維數組
d = np.array((1,2), dtype=complex) # 當然也可以通過dtype指定相應的類型
  • 如果只知道shape,該怎麼創建數組
    這樣有個好處是省了數組擴容的開銷
e = np.zeros((2,3)) # 創建大小爲(2,3)的數組,元素全爲0,dtype=np.float64默認
f = np.ones((2,2), dtype=np.int32) #當然也可以制定數組的dtype
g = np.empty((2,4)) # 創建空數組,這樣的話元素隨機初始化
  • numpy有個函數爲arange和python build-in的range相似,但是返回的是array
a = np.arange(10, 25, 5) # 10,15,20, 包左不包右
b = np.arange(1.0, 1.2, 0.1) # 1.0,1.1
c = np.linspace(0,1,3) # 0, 0.5 如果是float通常建議使用該函數,可以指定個數

4. 如何print ndarray

#最後一維是從左往右邊,剩下的都是從上到下
a = np.arange(24).reshape(2, 3, 3)
[[[ 0  1  2  3]  #最後一維,從左到右
  [ 4  5  6  7]  #倒數第二維到倒數第一維是從上到下
  [ 8  9 10 11]] #依次類推

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

5. numpy四則運算

  • 四則運算在array上是elementwise的是每個element進行運算
a = np.array((1, 2, 3, 4))
b = np.arange(4)  # [0, 1, 2, 3]
c = a - b  # [1, 1, 1, 1]
d = a**2 # [2, 4, 6, 8]
a < 3  # True, True, False, False
# array中對應元素相乘和矩陣相乘
a = np.array([[1, 2], [3, 4]])
b = np.array([[1, 1], [1, 1]])
c = a * b #對應相乘
d = a.dot(b) #矩陣相乘
# += *=是原地(in place)進行修改變量
a = np.array([1, 2])
a *= 2 # 是直接對a進行處理
  • 常用函數sum
    通常一些函數是不用指定shape的如sum, 當然也可以指定
    這裏解釋下軸的概念,可以使用下面這張圖,軸=0的時候表示行,從上到下,軸=1的時候表示列,從左到右。
    在這裏插入圖片描述
a = np.array([[1, 2], [3, 4]])
a.sum() # 10
a.sum(axis=0) # 4, 6  #相當於以列爲單位進行求和
a.sum(axis=1) # 3, 7

6.universal 函數

universal函數包括np.exp, np.sqrt, 返回一個array

B = np.range(3)
np.exp(b) # array([0. , 1. , 1.41421356])

7. 一維數組和高維數組索引,切邊和遍歷

# 一位數組索引
a = np.arange(10) ** 3

print(a)
# 索引第三個位置
print(a[2])
# 切片 包左不包右
print(a[0:2])
# 可以進行賦值,同樣包左不包右
a[0:4:2] = 100 #和a[:4:2]等價
print(a)
b = np.arange(24).reshape(4,6)
print(b)
#二位數組索引
print(b[0,1])
#索引一行, 如果索引缺省則爲:
print(b[1, :])
print(b[1])
# 遍歷,相當於遍歷一行, 如果是三維數組則按照第一個axis進行面遍歷。
for i in b:
    print(i)

8. 操縱shape

c = np.arange(6).reshape(2,3)
print(c) # [[0, 1, 2], [3, 4, 5]] 

# 可以通過ravel進行flatten,但是不會改變c
b = c.ravel() # [0, 1, 2, 3, 4, 5]
print(b)
print(c)      #沒有改變

# reshape和T,都不改變value,但是會返回值
print(c.reshape(3,2)) # 等價與c.reshape(3, -1)
print(c.T)

9. 是否copy array(重要)

不會copy的情況

c = np.arange(6).reshape(2,3)
print(c) # [[0, 1, 2], [3, 4, 5]] 

# 可以通過ravel進行flatten,但是不會改變c
b = c.ravel() # [0, 1, 2, 3, 4, 5]
print(b)
print(c)      #沒有改變

# reshape和T,都不會改變value,但是會返回值
print(c.reshape(3,2)) # 等價與c.reshape(3, -1)
print(c.T)

view and shallow copy

# view() 創建一個對象但是共用數據, 並且切片相當於返回view
d = np.arange(6).reshape(2, 3) #[[0, 1, 2], [3, 4, 5]]
e = d.view()  # d和e共用一樣的數據
e = e.reshape(1, 6)
print(d)
print(e) # [0, 1, 2, 3, 4, 5]
#但是如果改數據的話,就會同時改變
e[0, 5] = 10
print(d) #[[0, 1, 2], [3, 4, 10]] 
print(e) #[0, 1, 2, 3, 4, 10]

深拷貝copy

a = np.array([1, 2])
b = a.copy()
b[0, 1] = 5
print(a) # [1, 2]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章