1. 程式人生 > >【Numpy】學習筆記1

【Numpy】學習筆記1

文章目錄

一、概述

numpy 支援大量高維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫。機器學習涉及到大量對陣列的變換和運算。

二、基礎

import numpy as np
print(np.__version__)

輸出結果

1.14.3

1、建立陣列

NumPy 的主要物件是多維陣列 Ndarray。在 NumPy 中維度(dimensions)叫做軸(axes),軸的個數叫做秩(rank)。

下面的陣列的秩為 2。第一個維度(軸)長度為 2,第二個維度(軸)長度為 3。

[[1., 2., 3.],
 [4., 5., 6.]]

(1)通過 list 建立陣列

## 一維陣列
print(np.array([1, 2, 3]))
## 二維陣列
print(np.array([[1, 2, 3], [4, 5, 6]])

輸出結果

array([1, 2, 3])
array([[1, 2, 3],
       [4, 5, 6]])

(2)特殊陣列

zeros()、ones()、arange()、eye()、linespace()、random.rand()、random.randint()、fromfunction()

## 全為 0 的二維陣列
np.zeros((3, 5))
# array([[0., 0., 0., 0., 0.],
# [0., 0., 0., 0., 0.], # [0., 0., 0., 0., 0.]]) ## 全為 1 的三維陣列 np.ones((2, 3, 4)) # array([[[1., 1., 1., 1.], # [1., 1., 1., 1.], # [1., 1., 1., 1.]], # [[1., 1., 1., 1.], # [1., 1., 1., 1.], # [1., 1., 1., 1.]]]) ## 一維等差陣列 np.arange(5) # array([0, 1, 2, 3, 4]) ## 二維等差陣列 np.arange(6).reshape(2, 3) # array([[0, 1, 2], # [3, 4, 5]]) ## 單位矩陣(二維陣列) np.eye(3) # array([[1., 0., 0.], # [0., 1., 0.], # [0., 0., 1.]]) ## 等間隔一維陣列:[1, 10]區間上等間隔的六個數 np.linspace(1, 10, num=6) # array([ 1. , 2.8, 4.6, 6.4, 8.2, 10. ]) ## 二維隨機陣列 np.random.rand(2, 3) # array([[0.52506848, 0.53357141, 0.53381268], # [0.16647792, 0.22610891, 0.62271866]]) ## 二維隨機整數陣列(數值小於 5) np.random.randint(5, size=(2, 3)) # array([[2, 0, 4], # [0, 3, 0]]) ## 自定義函式建立陣列:建立大小為(3,5)的資料 np.fromfunction(lambda i, j : i + j, (3, 5)) # array([[0., 1., 2., 3., 4.], # [1., 2., 3., 4., 5.], # [2., 3., 4., 5., 6.]])

2、陣列運算

(1)基礎運算(一維)

相對應元素之間進行運算。

## 建立兩個一維陣列,a、b
a = np.array([10, 20, 30, 40, 50])
b = np.arange(1, 6)
a, b
# (array([10, 20, 30, 40, 50]), array([1, 2, 3, 4, 5]))

print(a + b)
print(a - b)
print(a * b)
print(a / b)
# array([11, 22, 33, 44, 55])
# array([ 9, 18, 27, 36, 45])
# array([ 10,  40,  90, 160, 250])
# array([10., 10., 10., 10., 10.])

(2)基礎運算(二維)

  • 重點:矩陣乘法、轉置、逆矩陣
## 建立二維矩陣:A、B
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
A, B
# (array([[1, 2],
#         [3, 4]]), array([[5, 6],
#         [7, 8]]))

print(A + B)
print(A - B)
# array([[ 6,  8],
#        [10, 12]])
# array([[-4, -4],
#        [-4, -4]])

## 矩陣元素間的乘法
print(A * B)
# array([[ 5, 12],
#        [21, 32]])

## 矩陣乘法運算
print(np.dot(A, B))
# array([[19, 22],
#        [43, 50]])

## 如果使用 np.mat 將二維陣列準確定義為矩陣,就可以直接使用 * 完成矩陣乘法計算
print(np.mat(A) * np.mat(B))
# matrix([[19, 22],
#         [43, 50]])

## 數乘矩陣
print(A * 2)
# array([[2, 4],
#        [6, 8]])

## 矩陣的轉置
print(A.T)
# array([[1, 3],
#        [2, 4]])

## 矩陣求逆
print(np.linalg.inv(A))
# array([[-2. ,  1. ],
#        [ 1.5, -0.5]])

3、數學函式

print(a)
# [10 20 30 40 50]

np.sin(a)        # 三角函式
np.exp(a)        # 指數
np.sqrt(a)		 # 開方運算
np.power(a, 3)   # 立方運算
# array([-0.54402111,  0.91294525, -0.98803162,  0.74511316, -0.26237485])
# array([2.20264658e+04, 4.85165195e+08, 1.06864746e+13, 2.35385267e+17, 5.18470553e+21])
# array([3.16227766, 4.47213595, 5.47722558, 6.32455532, 7.07106781])
# array([  1000,   8000,  27000,  64000, 125000])

4、陣列切片和索引

## 一維切片
a = np.array([1, 2, 3, 4, 5])
a[0], a[-1]
# (1, 5)

print(a[0:2], a[:-1])
# (array([1, 2]), array([1, 2, 3, 4]))

## 二維切片
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
## 第一行、最後一行
print(a[0], a[-1])
## 第二列
print(a[:, 1])
## 第 2,3 行
print(a[1:3, :])

5、陣列形狀操作

(1)形變

  • reshape()方法:改變陣列形狀(但不改變原始陣列)
  • ravel()方法:將多維陣列拉成一維陣列。
a = np.random.random((3, 2))
print(a)
# [[0.32136021 0.28243107]
#  [0.98636992 0.96468233]
#  [0.02745087 0.75451614]]

print(a.shape)         # 陣列形狀:(3, 2)
print(a.reshape(2,3))  # 改變陣列形狀=》(2, 3)
print(a)
# array([[0.32136021, 0.28243107, 0.98636992],
#       [0.96468233, 0.02745087, 0.75451614]])
# array([[0.32136021, 0.28243107],
#        [0.98636992, 0.96468233],
#        [0.02745087, 0.75451614]])

## 展平陣列,即拉成一維陣列
print(a.ravel()) 
# array([0.32136021, 0.28243107, 0.98636992, 0.96468233, 0.02745087, 0.75451614])

(2)陣列的拼合

a = np.random.randint(10, size=(3, 4))
b = np.random.randint(10, size=(3, 4))
a, b
# (array([[1, 1, 4, 0],
#         [2, 2, 4, 3],
#         [1, 8, 4, 3]]), array([[2, 9, 1, 1],
#         [7, 9, 0, 2],
#         [6, 5, 0, 9]]))

## 垂直拼合陣列
print(np.vstack((a, b)))
## 水平拼合陣列
print(np.hstack((a, b)))
# array([[1, 1, 4, 0],
#        [2, 2, 4, 3],
#        [1, 8, 4, 3],
#        [2, 9, 1, 1],
#        [7, 9, 0, 2],
#        [6, 5, 0, 9]])
# array([[1, 1, 4, 0, 2, 9, 1, 1],
#        [2, 2, 4, 3, 7, 9, 0, 2],
#        [1, 8, 4, 3, 6, 5, 0, 9]])

## 沿橫軸分割陣列
print(np.hsplit(a, 4))
## 沿縱軸分割陣列
print(np.vsplit(a, 3))
# [array([[1],
#         [2],
#         [1]]), array([[1],
#         [2],
#         [8]]), array([[4],
#         [4],
#         [4]]), array([[0],
#         [3],
#         [3]])]
# [array([[1, 1, 4, 0]]), array([[2, 2, 4, 3]]), array([[1, 8, 4, 3]])]

6、陣列排序

axis = 0 代表列;
axis = 1 代表行。

a = np.array(([1, 4, 3], [6, 2, 9], [4, 7, 2]))

## 返回每列最大值
print(np.max(a, axis = 0))
## 返回每行最小值
print(np.min(a, axis = 1))
## 返回每列最大值索引
print(np.argmax(a, axis = 0))
## 返回每行最小值索引
print(np.argmin(a, axis = 1))
# array([6, 7, 9])
# array([1, 2, 2])
# array([1, 2, 1])
# array([0, 1, 2])

7、陣列統計

## 統計陣列各列的中位數
print(np.median(a, axis = 0))
## 各行的算術平均值
print(np.mean(a, axis = 1))
## 各列的加權平均值
print(np.average(a, axis = 0))
## 各行的方差
print(np.var(a, axis = 1))
## 各列的標準偏差
print(np,std(a, axis = 0))

# array([4., 4., 3.])
# array([2.66666667, 5.66666667, 4.33333333])
# array([3.66666667, 4.33333333, 4.66666667])
# array([1.55555556, 8.22222222, 4.22222222])
# array([2.05480467, 2.05480467, 3.09120617])

三、進階(以題的形式)

1、建立一個 5x5 的二維陣列,其中邊界值為1,其餘值為0

Z = np.ones((5, 5))
Z[1:-1, 1:-1] = 0
print(Z)
# array([[1., 1., 1., 1., 1.],
#        [1., 0., 0., 0., 1.],
#        [1., 0., 0., 0., 1.],
#        [1., 0., 0., 0., 1.],
#        [1., 1., 1., 1., 1.]])

2、使用數字 0 將一個全為 1 的 5x5 二維陣列包圍
==》np.pad() 方法

Z = np.ones((5, 5))
Z = np.pad(Z, pad_width=1, mode='constant', constant_values = 0)
print(Z)
# array([[0., 0., 0., 0., 0., 0., 0.],
#        [0., 1., 1., 1., 1., 1., 0.],
#        [0., 1., 1., 1., 1., 1., 0.],
#        [0., 1., 1., 1., 1., 1., 0.],
#        [0., 1., 1., 1., 1., 1., 0.],
#        [0., 1., 1., 1., 1., 1., 0.],
#        [0., 0., 0., 0., 0., 0., 0.]])

3、建立一個 5x5 的二維陣列,並設定值 1, 2, 3, 4 落在其對角線下方
==》np.diag(),其中k表示元素的位置,k=0表示對角線,k>0表示對角線上方,k<0表示對角線下方,k的大小表示與對角線的“距離”(決定陣列的大小)

Z = np.diag(1 + np.arange(4), k=-3)
print(Z)
# array([[0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0],
#        [1, 0, 0, 0, 0, 0, 0],
#        [0, 2, 0, 0, 0, 0, 0],
#        [0, 0, 3, 0, 0, 0, 0],
#        [0, 0, 0, 4, 0, 0, 0]])
Z = np.diag(1 + np.arange(4), k=0)
print(Z)
# array([[1, 0, 0, 0],
#        [0, 2, 0, 0],
#        [0, 0, 3, 0],
#        [0, 0, 0, 4]])

4、建立一個 10x10 的二維陣列,並使得 1 和 0 沿對角線間隔放置

Z = np.zeros((10, 10), dtype=int)
Z[1::2, ::2] = 1
Z[::2, 1::2] = 1
print(Z)
# array([[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
#        [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
#        [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
#        [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
#        [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
#        [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
#        [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
#        [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
#        [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
#        [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]])

5、建立一個 0-10 的一維陣列,並將 (1, 9] 之間的數全部反轉成負數

Z = np.arange(11)
Z[(1 < Z) & (Z <= 9)] *= -1
print(Z)
# [ 0  1 -2 -3 -4 -5 -6 -7 -8 -9 10]

6、找出兩個一維陣列中相同的元素

Z1 = np.random.randint(0, 10, 15)
Z2 = np.random.randint(0, 10, 10)
print("Z1:", Z1)
print("Z2:", Z2)
np.intersect1d(Z1, Z2)
# Z1: [3 8 5 5 1 0 5 2 3 8 3 1 4 0 4]
# Z2: [2 8 4 8 3 7 3 1 5 3]
# array([1, 2, 3, 4, 5, 8])

7、找出兩個一維陣列中相同的元素

Z = np.zeros((5, 5))
Z += np.arange(1, 6)
print(Z)
# [[1. 2. 3. 4. 5.]
#  [1. 2. 3. 4. 5.]
#  [1. 2. 3. 4. 5.]
#  [1. 2. 3. 4. 5.]
#  [1. 2. 3. 4. 5.]]

8、時間計算

yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D')
today = np.datetime64('today', 'D')
tomorrow = np.datetime64('today', 'D') + np.timedelta64(1, 'D')
print('Yesterday: ', yesterday)
print('Today: ', today)
print('Tomorrow: ', tomorrow)
# Yesterday:  2019-01-02
# Today:  2019-01-03
# Tomorrow:  2019-01-04

9、提取一個隨機陣列的整數部分

Z = np.random.uniform(0, 10, 10)
print("原始值: ", Z)

print("方法 1:", Z - Z % 1)      # 減去小數部分
print("方法 2:", np.floor(Z))    # 返回輸入值的下限,即輸入引數的最大整數。
print("方法 3:", np.ceil(Z) - 1) # 返回輸入值的上限
print("方法 4:", Z.astype(int))  # 型別轉換
print("方法 5:", np.trunc(Z))    # 擷取
# 原始值:  [5.56601634 4.77164344 3.08836714 3.30325796 6.15169633 9.79808824 4.38637838 6.39368379 9.62265927 2.32704462]
# 方法 1: [5. 4. 3. 3. 6. 9. 4. 6. 9. 2.]
# 方法 2: [5. 4. 3. 3. 6. 9. 4. 6. 9. 2.]
# 方法 3: [5. 4. 3. 3. 6. 9. 4. 6. 9. 2.]
# 方法 4: [5 4 3 3 6 9 4 6 9 2]
# 方法 5: [5. 4. 3. 3. 6. 9. 4. 6. 9. 2.]

10、建立一個長度為 5 的等間隔一維陣列,其值域範圍從 0 到 1,但是不包括 0 和 1

  • numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
  • 在指定的間隔 [start, stop] 內返回均勻間隔的數字。其中,endpoint為True表示包括stop,False表示不包括;
Z1 = np.linspace(0,1,6,endpoint=False)[1:]
Z2 = np.linspace(0, 1, 7)[1:-1]
print(Z1)
print(Z2)
# array([0.16666667, 0.33333333, 0.5       , 0.66666667, 0.83333333])
# array([0.16666667, 0.33333333, 0.5       , 0.66666667, 0.83333333])

11、建立一個 3x3 的二維陣列,並將列按升序排序:

  • 按列排序:axis = 0
Z = np.array([[7, 4, 3], [3, 1, 2], [4, 2, 6]])
Z.sort(axis = 0)
Z
# array([[3, 4, 7],
#        [1, 2, 3],
#        [2, 4, 6]])

12、列印每個 NumPy 標量型別的最小值和最大值

  • np.iinfo(dtype):dtype 型別(需為整型)的資訊
  • np.finfo(dtype):dtype 型別(需為浮點型)的資訊
for dtype in [np.int8, np.int32, np.int64]:
    print("The minimum value of {}: ".format(dtype), np.iinfo(dtype).min)
    print("The maximum value of {}: ".format(dtype), np.iinfo(dtype).max)
for dtype in [np.float32, np.float64]:
    print("The minimum value of {}: ".format(dtype), np.finfo(dtype).min)
    print("The maximum value of {}: ".format(dtype), np.finfo(dtype).max)
# The minimum value of <class 'numpy.int8'>:  -128
# The maximum value of <class 'numpy.int8'>:  127
# The minimum value of <class 'numpy.int32'>:  -2147483648
# The maximum value of <class 'numpy.int32'>:  2147483647
# The minimum value of <class 'numpy.int64'>:  -9223372036854775808
# The maximum value of <class 'numpy.int64'>:  9223372036854775807
# The minimum value of <class 'numpy.float32'>:  -3.4028235e+38
# The maximum value of <class 'numpy.float32'>:  3.4028235e+38
# The minimum value of <class 'numpy.float64'>:  -1.7976931348623157e+308
# The maximum value of <class 'numpy.float64'>:  1.7976931348623157e+308

13、將 float32 轉換為整型:astype()

Z= np.arange(10, dtype=np.float32)
print(Z)

Z = Z.astype(np.int32, copy=False)
Z
# [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32)

14、從隨機一維陣列中找出距離給定數值(0.5)最近的數

  • flat 陣列的迭代器
Z = np.random.uniform(0, 1, 20)
z = 0.5
m = Z.flat[np.abs(Z-z).argmin()]
m

15、非零元素索引位置:np.nonzero()

Z = np.nonzero([1,2,0,3,5,2,0])
Z
# (array([0, 1, 3, 4, 5]),)

16、對於給定的 5x5 二維陣列,在其內部隨機放置 p 個值為 1 的數

  • np.random.choice(range(5 * 6), p, replace=False)
    • 在range(5 * 6)中選擇p個數據。
  • np.put(Z, pos, value):將Z中索引為pos的值設定為value
p = 3
Z = np.zeros((5
            
           

相關推薦

Numpy學習筆記1

文章目錄 一、概述 二、基礎 1、建立陣列 (1)通過 list 建立陣列 (2)特殊陣列 2、陣列運算 (1)基礎運算(一維) (2

吳恩達機器學習學習筆記——1.5無監督學習

分類 哪些 rep epm 朋友 工作 style class 客戶 1 無監督學習:在不知道數據點的含義的情況下,從一個數據集中找出數據點的結構關系。 2 聚類算法:相同屬性的數據點會集中分布,聚集在一起,聚類算法將數據集分成不同的聚類。也就是說,機器不知道這些數據點具體

Robot定位 學習筆記 1GPS和IMU(慣導)在無人駕駛中的應用

無人駕駛定位技術 行車定位是無人駕駛最核心的技術之一,全球定位系統(GPS)在無人駕駛定位中也擔負起相當重要的職責。然而無人車是在複雜的動態環境中行駛,尤其在大城市,GPS多路徑反射的問題會很明顯。這樣得到的GPS定位資訊很容易就有幾米的誤差。對於在有限寬度高速行駛的汽車來說,這樣的誤差很有可能

深入理解JVM學習筆記——-1、JVM基本結構

轉載自:https://blog.csdn.net/singit/article/details/54920387?utm_source=blogkpcl11   什麼是jvm?JVM的基本結構, 也就是概述。說是概述,內容很多,而且概念量也很大, 不過關於概念方面,你不用擔心,我完全有信心

Unity3D學習筆記(第1記) 敵人AI之Seek(靠近)

using UnityEngine; using System.Collections; public class enemyController : MonoBehaviour { publi

Python學習筆記十三:函數的參數對應

color 筆記 屏幕 *args borde 基於 但是 all small 位置傳遞 我們在定義函數時候已經對函數進行了參數傳遞調用,但是那只是粗淺的位置傳遞 示例 def sum(a,b,c): d = a+b+c return d p

Python學習筆記4-內置函數

打印數字 筆記 轉換 查看 判斷 lis clas 函數 ted 1、內置函數 1 print(all([1,2,3,0])) #判斷可叠代對象裏面是否都為真:非零即真非空即真原則 2 print(any([1,2,3,0])) #判斷可叠代對象裏面是否有一個為真:非

Python學習筆記4-time、md5、加密base64模塊

數據庫 sta 自己的 pri 時間 decode 不可 字符 ftime 1、time # 1、格式化好的時間 2018-1-14 16:42# 2、時間戳 是從unix元年到現在所有的秒數# 3、時間元組# 想時間戳和格式化好的時間互相轉換的話,都要先轉成時間元組,然後

Python學習筆記4-os、sys模塊

etc 創建 記錄 body spa platform pri eas usr 1、os操作系統模塊 1 import os 2 print(os.getcwd()) #獲取當前工作目錄 3 # print(os.chdir("..")) #更改當前目錄.當前目錄

Python學習筆記5-操作mysql數據庫pymysql

rod bsp phone utf8 charset delet 建立 包含 hone import pymysql#其他數據庫,比如oracle 模塊是pyoracle#1、鏈接數據庫mysq ip 端口號 密碼 賬戶 數據庫#2、建立遊標#3、執行sql#4、獲取結果#

Python學習筆記5-利用flask來mock接口

入口 輸出 端口號 delet app file log asc conf # 1、mock接口# import flask #python的輕量級的開發框架# # 接口,後臺服務的開發# # 在瀏覽器運行http://127.0.0.1:8080/get_user即可,或

python學習筆記10-ddt數據驅動

get args code imp content coo 文檔 AR ems DDT的使用 DDT包含類的裝飾器ddt和兩個方法裝飾器data(直接輸入測試數據),file_data(可以從json或者yaml中獲取測試數據) 只有yaml和yml結尾的文件以yaml形式

2018/09/07《塗抹MySQL》引擎學習筆記(四)

靈活 appears 優點 tables use 做什麽 null div 在線 讀   第七章《引擎》 總結 1:什麽是引擎?   - 就是一種數據存取和處理方式。   - 在 MySQL 中,引擎是以"插件式"存在的,使我們可以很方便的使用各種引擎。 2:怎麽查

Python學習筆記

數字型別 整數型別:沒有取值範圍限制 浮點數型別:浮點數精度受限,但精度很高,除科學計算外可視為不受限 複數型別:z = a + bj   實數部分:z.real  複數部分:z.imag

learn numpy & pandas 學習筆記1

import numpy as np array = np.array([[1,2,3],[2,3,4]]) #列表轉化為矩陣 print(array) print('number of dim:',array.ndim) # 維度 print('sh

博弈論學習筆記

帝王為何殺功臣,大副如何謀位船長,傻B的另一種解釋…… 三姬分金 假設有A,B,C三個人,分100枚金幣。怎麼分呢?我們定一個規則,按順序提議,就是A先提議,B,再C,並且如果未超半數以上,不包括半數,同意提議,自己也有投票權。 前提假設: 三人很聰明,追求

Python程式設計筆記1

一、概述 Python 提供了非常完善的基礎程式碼庫: 覆蓋了網路、檔案、GUI、資料庫、文字等大量內容,被形象地稱作“內建電池( batteries included) ”。 ==》許多功能不必從零編寫,直接使用現成的即可。 特點:“優雅”、 “明確”、 “簡單” 編譯執行

httpClient學習筆記

HTTP 協議概述 HTTP–Hyper Text Transfer Protocol,超文字傳輸協議,是一種建立在TCP上的無狀態連線,整個基本的工作流程是客戶端傳送一個HTTP請求,說明客戶端想要訪問的資源和請求的動作,服務端收到請求之後,服務端開始處理

LaTex學習筆記:入門使用方法

     本部落格的LaTex學習以MiKTex+TeXStudio為編輯器。      關於LaTex環境的搭建和相關軟體的安裝,我主要是用了以下軟體: proTeXt:http://tug.org