主頁 > 後端開發 > 【技識訓累】Python中的NumPy庫【一】

【技識訓累】Python中的NumPy庫【一】

2023-06-08 11:21:06 後端開發

NumPy庫是什么

NumPy是Python科學計算的核心庫之一,用來進行科學計算,數值分析等矩陣運算,主要提供了以下幾種功能:

1.多維陣列(ndarray)物件,可以進行快速的數值計算和陣列操作;

2.廣播(Broadcast)功能,可以對不同形狀的陣列進行算術運算;

3.數學函式庫,可以對陣列進行各種數學運算;

4.線性代數、傅里葉變換、亂數生成等工具操作;

5.不同資料型別之間的傳輸功能;

6.資料的輸入和輸出功能,

在NumPy中,最重要的是它的ndarray物件,多為n維陣列,因此它非常適合處理科學計算中的向量、矩陣等資料結構,numpy比串列更加高效,可以大大提高程式運行速度,是資料處理和科學計算的主要工具之一,

如何在NumPy中生成亂數?

在 NumPy 中,我們可以使用 random 模塊來生成亂數,

下面是一些常用的亂數生成函式:

  1. np.random.rand():生成 0 到 1 之間的隨機浮點數,可以接收任意個引數作為亂數生成器的形狀,

  2. np.random.randn():生成符合標準正態分布的亂數,可以接收任意個引數作為亂數生成器的形狀,

  3. np.random.randint():生成整數型的亂數,可以接收兩個引數:最小值和最大值,

  4. np.random.random():生成 0 到 1 之間的隨機浮點數,可以接收一個引數作為輸出的形狀,

  5. np.random.shuffle():隨機打亂一個序列,可以接收一個引數作為要打亂的序列,

  6. np.random.choice():從指定的序列中隨機挑選一個元素,可以接收兩個引數:序列和挑選出元素的數量,

import numpy as np

# 生成一個形狀為 (3, 2) 的隨機浮點數陣列
arr1 = np.random.rand(3, 2)

# 生成一個形狀為 (3, 2) 的符合標準正態分布的亂數陣列
arr2 = np.random.randn(3, 2)

# 生成 0 到 9 之間的隨機整數
randint = np.random.randint(10)

# 生成一個形狀為 (1, 3) 的隨機浮點數陣列
arr3 = np.random.random((1, 3))

# 打亂一個序列
arr4 = np.arange(10)
np.random.shuffle(arr4)

# 從指定的序列中隨機挑選一個元素
choice = np.random.choice([1, 2, 3, 4, 5, 6], 1)

NumPy中NDArray物件有什么特點?

NumPy中NDArray(N-dimensional array)物件有以下特點:

  1. 它是多維陣列,可以表示任意維度的資料,

  2. 所有元素必須是同一型別的資料,

  3. 它支持向量化操作,即對整個陣列的操作只需要一條陳述句即可實作,

  4. 它快速且高效,因為它是使用C語言實作的,并且在記憶體使用和計算效率方面進行了優化,

  5. 它提供了大量的科學計算函式和方法,包括線性代數、傅里葉變換、統計分析等,

  6. 它易于與其他資料處理工具(如Pandas、SciPy等)集成使用,可以提高資料分析處理效率,并且支持大資料量的高效處理,

如何使用NumPy創建對角矩陣?

使用diag函式創建對角矩陣

import numpy as np
# 創建一個3x3的對角矩陣,對角線元素為1
diag_matrix = np.diag([1, 1, 1])
print(diag_matrix)
array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1]])

你也可以在diag函式中使用一個數字來創建對應大小的對角矩陣,

# 創建一個5x5的對角矩陣,對角線元素為2
diag_matrix = np.diag(2*np.ones(5))
print(diag_matrix)
array([[2., 0., 0., 0., 0.],
       [0., 2., 0., 0., 0.],
       [0., 0., 2., 0., 0.],
       [0., 0., 0., 2., 0.],
       [0., 0., 0., 0., 2.]])

如何使用NumPy進行陣列展平和拉伸操作?

NumPy提供了兩個方法flatten()和ravel()都可用于將多維陣列展平為一維陣列,不同之處在于ravel()回傳的是原陣列的視圖,而flatten()回傳的是原陣列的副本,下面是使用flatten()和ravel()方法展示多維陣列的方法:

1.使用flatten()方法

import numpy as np

# 創建一個2x3的二維陣列
a = np.array([[1, 2, 3], [4, 5, 6]])

# 展平陣列
b = a.flatten()

print('原陣列:')
print(a)

print('展平后的陣列:')
print(b)
原陣列:
[[1 2 3]
 [4 5 6]]

展平后的陣列:
[1 2 3 4 5 6]

2.使用ravel()方法

import numpy as np

# 創建一個2x3的二維陣列
a = np.array([[1, 2, 3], [4, 5, 6]])

# 拉伸陣列
b = a.ravel()

print('原陣列:')
print(a)

print('拉伸后的陣列:')
print(b)
原陣列:
[[1 2 3]
 [4 5 6]]

拉伸后的陣列:
[1 2 3 4 5 6]

如何在NumPy中進行陣列廣播操作?

NumPy的陣列廣播操作可以在不同形狀的陣列之間進行數學運算,簡化了陣列的操作和計算,陣列廣播主要遵循以下規則:

  1. 陣列維度不同,可以將維度較小的陣列延伸為維度較大的陣列,使它們的維度相等,
  2. 如果兩個陣列在某個維度上的形狀相同,或者其中一個陣列在該維度上的形狀為1,則稱它們在該維度上是兼容的,可以進行數學運算,
  3. 在任何維度上,如果一個陣列形狀為1,則可以沿著該維度擴展為另一個陣列的對應維度,

以下是一個示例,演示如何使用numpy進行陣列廣播:

import numpy as np

#創建兩個形狀不同的陣列
a = np.array([1, 2, 3])
b = np.array([[1], [2], [3]])

#列印兩個陣列的形狀
print("a.shape = ", a.shape)
print("b.shape = ", b.shape)

#使用陣列廣播計算a和b的和
c = a + b
print("a + b = \n", c)
a.shape = (3,)
b.shape = (3, 1)
a + b =
 [[2 3 4]
 [3 4 5]
 [4 5 6]]

在這個示例中,我們創建了兩個陣列a和b,它們的形狀不同,然后,我們使用陣列廣播計算a和b的和,由于a和b的形狀不同,我們可以將維度較小的陣列b延伸為維度相等的陣列,以兼容它們之間的加法運算,最后,我們將結果存盤在新陣列c中,

如何使用NumPy進行陣列的切片和子集選擇?

NumPy可以使用切片和布爾索引來選擇陣列的子集,、

使用切片可以選擇陣列的某一部分,例如:

import numpy as np

a = np.array([1, 2, 3, 4, 5])
b = a[1:4]  # 選擇a[1]到a[3]的元素
print(b)  # 輸出 [2 3 4]

也可以對多維陣列進行切片,例如:

a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
b = a[0:2, 1:3]  # 選擇a中第1列到第2列、第2行到第3行的元素
print(b)  # 輸出 [[2 3]
          #     [5 6]]

使用布爾索引可以根據某種條件選擇陣列中的元素,例如:

a = np.array([1, 2, 3, 4, 5])
b = a[a > 2]  # 選擇a中大于2的元素
print(b)  # 輸出 [3 4 5]

也可以對多維陣列使用布爾索引,例如:

a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
b = a[a > 2]  # 選擇a中大于2的元素
print(b)  # 輸出 [3 4 5 6 7 8 9]

注意,布爾索引回傳的是一維陣列,需要使用reshape方法將其轉換為多維陣列,可以使用np.where來進行更復雜的條件選擇,

如何使用NumPy進行矩陣運算和線性代數計算?

NumPy是Python語言的一個擴展庫,專門處理大型多維陣列與矩陣運算,NumPy提供了許多線性代數和矩陣操作函式,下面是使用NumPy進行矩陣運算的一些例子:

  • 創建矩陣

要使用NumPy創建一個矩陣,可以使用numpy.array()函式,并將二維陣列傳遞給它,

import numpy as np

# 創建一個3x3的矩陣
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(matrix)

# 輸出:
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]
  • 矩陣轉置

要使用NumPy將矩陣轉置,可以使用numpy.transpose()函式,

import numpy as np

# 創建一個3x3的矩陣
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(matrix)

# 轉置矩陣
matrix_transpose = np.transpose(matrix)
print(matrix_transpose)

# 輸出:
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]
# [[1 4 7]
#  [2 5 8]
#  [3 6 9]]
  • 矩陣相加和矩陣相減

要使用NumPy對矩陣進行加法和減法操作,可以使用numpy.add()和numpy.subtract()函式,

import numpy as np

# 創建兩個矩陣
matrix_a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix_b = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]])

# 矩陣相加
matrix_sum = np.add(matrix_a, matrix_b)
print(matrix_sum)

# 矩陣相減
matrix_diff = np.subtract(matrix_a, matrix_b)
print(matrix_diff)

# 輸出:
# [[10 10 10]
#  [10 10 10]
#  [10 10 10]]
# [[-8 -6 -4]
#  [-2  0  2]
#  [ 4  6  8]]
  • 矩陣乘法

要使用NumPy進行矩陣乘法,可以使用numpy.dot()函式,

import numpy as np

# 創建兩個矩陣
matrix_a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix_b = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]])

# 矩陣乘法
matrix_prod = np.dot(matrix_a, matrix_b)
print(matrix_prod)

# 輸出:
# [[ 30  24  18]
#  [ 84  69  54]
#  [138 114  90]]
  • 行列式和逆矩陣

要使用NumPy計算行列式和逆矩陣,可以使用numpy.linalg.det()和numpy.linalg.inv()函式,

import numpy as np

# 創建一個3x3的矩陣
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 計算矩陣的行列式
matrix_det = np.linalg.det(matrix)
print(matrix_det)

# 計算矩陣的逆矩陣
matrix_inv = np.linalg.inv(matrix)
print(matrix_inv)

# 輸出:
# 0.0
# [[-3.00000000e+00  6.00000000e+00 -3.00000000e+00]
#  [ 6.00000000e+00 -1.20000000e+01  6.00000000e+00]
#  [-3.00000000e+00  6.00000000e+00 -3.00000000e+00]]

這些只是NumPy中可用的許多矩陣運算之一,NumPy庫還提供了其他矩陣運算,如解線性方程組等等 逆矩陣可以計算其它方面的線性代數問題,如解線性方程組,這是資料科學中不可或缺的,

如何使用NumPy進行資料的離散化和分組操作?

使用NumPy進行資料的離散化和分組操作可以使用numpy.digitize和numpy.bincount函式,

numpy.digitize函式可以將一組資料劃分為不同的區間,回傳每個資料所屬的區間編號;numpy.bincount函式可以統計每個區間內資料的數量,這兩個函式的聯合使用可以實作資料的離散化和分組操作,

例如,對資料進行10個區間的離散化,并統計每個區間內資料的數量可以使用以下代碼:

import numpy as np

data = https://www.cnblogs.com/yyyyfly1/p/np.array([1, 4, 8, 3, 6, 9, 2, 5, 7, 10])
bins = np.linspace(0, 10, 11) # 劃分為10個區間
indices = np.digitize(data, bins) # 劃分資料所屬區間
counts = np.bincount(indices)

上述代碼執行完畢后,counts陣列中即為每個區間內資料的數量,可以在此基礎上進行更多操作,例如計算每個區間內資料的平均值等,

NumPy如何進行陣列的輸入和輸出?

NumPy可以通過多種方式進行陣列的輸入和輸出,包括文本檔案、二進制檔案、記憶體緩沖等,

下面是一些常見的陣列輸入和輸出的方法和示例:

  1. 從文本檔案讀取陣列:
  2. 將陣列保存到文本檔案中:
  3. 從二進制檔案讀取陣列:
  4. 將陣列保存到二進制檔案中:
  5. 從記憶體緩沖讀取陣列:
  6. 將陣列保存到記憶體緩沖中:
import numpy as np
import io

# 從文本檔案讀取陣列
data = https://www.cnblogs.com/yyyyfly1/p/np.loadtxt('data.txt')
print(data)

# 將陣列保存到文本檔案中
data = https://www.cnblogs.com/yyyyfly1/p/np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
np.savetxt('data.txt', data)

# 從二進制檔案讀取陣列
data = https://www.cnblogs.com/yyyyfly1/p/np.load('data.npy')
print(data)

# 將陣列保存到二進制檔案中
data = https://www.cnblogs.com/yyyyfly1/p/np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
np.save('data.npy', data)

# 從記憶體緩沖讀取陣列
str_data = 'https://www.cnblogs.com/yyyyfly1/p/1 2 3/n4 5 6/n7 8 9'
data = https://www.cnblogs.com/yyyyfly1/p/np.genfromtxt(str_data.splitlines(), delimiter=' ')
print(data)

# 將陣列保存到記憶體緩沖中
data = https://www.cnblogs.com/yyyyfly1/p/np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
output = io.StringIO()
np.savetxt(output, data, delimiter=',')
str_data = https://www.cnblogs.com/yyyyfly1/p/output.getvalue()
print(str_data)

除此之外,NumPy還提供了很多其他的輸入和輸出方式,如Pandas DataFrame、HDF5等,具體可以查閱官方檔案,

在黑夜里夢想著光,心中覆寫悲傷,在悲傷里忍受孤獨,空守一絲溫暖, 我的淚水是無底深海,對你的愛已無言,相信無盡的力量,那是真愛永在, 我的信仰是無底深海,澎湃著心中火焰,燃燒無盡的力量,那是忠誠永在,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/554658.html

標籤:Python

上一篇:【python基礎】回圈陳述句-for回圈

下一篇:返回列表

標籤雲
其他(160606) Python(38217) JavaScript(25484) Java(18210) C(15237) 區塊鏈(8270) C#(7972) AI(7469) 爪哇(7425) MySQL(7238) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4588) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2435) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) 功能(1967) HtmlCss(1955) Web開發(1951) C++(1933) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1880) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • 【技識訓累】Python中的NumPy庫【一】

    博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ......

    uj5u.com 2023-06-08 11:21:06 more
  • 【python基礎】回圈陳述句-for回圈

    # 1.初始for回圈 for回圈可以遍歷任何可迭代物件,如一個串列或者一個字串。這里可迭代物件的概念我們后期介紹,先知道這個名詞就好了。 其語法格式之一: ![image](https://img2023.cnblogs.com/blog/3179433/202306/3179433-20230 ......

    uj5u.com 2023-06-08 11:07:05 more
  • 48基于java的學生課程成績系統設計與實作

    基于java的學生課程成績管理系統設計與實作,可適用于學生學生課程管理系統,學生成績管理系統,教務課程管理系統,教務系統,成績系統,課程系統,校園管理系統,校園課程管理系統,大學校園課程管理系統等等。 ......

    uj5u.com 2023-06-08 10:46:10 more
  • 【python爬蟲實戰】用python爬取愛奇藝電視劇十大榜單的全部資料

    [toc] # 一、爬取目標 本次爬取的目標是,愛奇藝電視劇類目下的10個榜單:[電視劇風云榜-愛奇藝風云榜](https://www.iqiyi.com/ranks1/2/0) ?![愛奇藝頁面](https://img2023.cnblogs.com/blog/2864563/202306/28 ......

    uj5u.com 2023-06-08 08:09:24 more
  • win10 vs2022 搭建 cocos2d-x 3.17 開發環境

    # 引擎下載地址 https://cocos2d-x.org/download/ 也可以在 github 下載 https://github.com/cocos2d/cocos2d-x/tags # 手冊地址 https://docs.cocos2d-x.org/cocos2d-x/v3/zh/ # ......

    uj5u.com 2023-06-08 08:09:10 more
  • LeetCode35.搜索插入位置

    //個人學習筆記用 - 題目: 給定一個排序陣列和一個目標值,在陣列中找到目標值,并回傳其索引。如果目標值不存在于陣列中,回傳它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的演算法。 參考題解--代碼隨想錄 - 暴力解法: ~~~c++ class Solution { pub ......

    uj5u.com 2023-06-08 08:09:06 more
  • 資料結構 in Golang:Hash Tables(哈希表)

    # 資料結構 in Golang:Hash Tables(哈希表) ### 場景 - 水果店的價格表: - 蘋果 Apple:3元 - 香蕉 Banana:4元 - 桃子 Peach:2元 - 梨 Pear:3元 - 找到一種水果的價格: - 可以使用 binary search,通過名稱來查找,耗 ......

    uj5u.com 2023-06-08 08:09:02 more
  • C++面試八股文:C++中,函式的引數應該傳值還是傳參考?

    某日二師兄參加XXX科技公司的C++工程師開發崗位第8面: > 面試官:C++中,函式的引數應該傳值還是傳參考? > > 二師兄:要看引數的用途。如果是出參,必須傳參考。如果是入參,主要考慮引數型別的大小,來決定傳值還是傳參考。 > > 面試官:為什么不使用指標? > > 二師兄:傳指標也稱之為傳引 ......

    uj5u.com 2023-06-08 08:08:58 more
  • IO流 p11 Properties

    **# Properties類** - **基本介紹** ![](https://img2023.cnblogs.com/blog/3008601/202306/3008601-20230604103622859-1793594469.png) 1. 專門用于讀寫組態檔的集合類 組態檔的格式: ......

    uj5u.com 2023-06-08 08:08:52 more
  • SpringMVC引數接收與資料回應

    ## SpringMVC如何接受請求引數(普通型別引數/物件型別引數/陣列/json資料等) 1、普通型別引數 (1)在可以在方法引數上使用@RequestParam注解來系結請求引數,此注解允許指定請求引數的名稱,以及是否是必須傳的引數。 ~~~java @RequestMapping("/exa ......

    uj5u.com 2023-06-08 08:08:48 more