Python學習之高級數組(一)

来源:https://www.cnblogs.com/chenzhijuan-324/archive/2019/03/25/10597271.html
-Advertisement-
Play Games

1.Python基礎學習之高級數組(一) 1.1視圖:就是與較大數組共用相同數據的較小數組。Numpy包提供數據視圖的概念是為了精確地控制記憶體的使用方式。 數組視圖、切片視圖、轉置和重塑視圖等 數組視圖實例: from numpy import* M=array([[1.,2.],[3.,4.]]) ...


1.Python基礎學習之高級數組(一)

1.1視圖:就是與較大數組共用相同數據的較小數組。Numpy包提供數據視圖的概念是為了精確地控制記憶體的使用方式。  數組視圖、切片視圖、轉置和重塑視圖等

數組視圖實例:

from numpy import*

M=array([[1.,2.],[3.,4.]])

v=M[0,:]    #切片是數組的視圖(切片視圖),它與M享有相同的數據。

print(v)

v[-1]=0

print(v)

print(M)       #註意:如果修改vM也會同時被修改

print(v.base)       #數組的屬性base能夠訪問擁有數據的對象,若數組擁有本身的數據,

#則其屬性base的值為none

print(v.base is M)

print(M.base)

運行結果:

[1. 2.]

[1. 0.]

[[1. 0.]

 [3. 4.]]

[[1. 0.]

 [3. 4.]]

True

None

切片視圖:只有基本切片(主要為帶冒號的索引表達式)將返回視圖,而任何高級切片(如使用布爾值的切片)都將返回數據的副本。

例如:

a=arange(4)

b=a[[2,3]]      #索引是一個列表[2,3],b是數組

print(b)

print(b.base is None)      #數據被覆制,b是數組

c=a[1:3]                

print(c)

print(c.base is None)       

M=M[:]

print(M)

補充:Numpy的試圖與副本:

 視圖是數據的一個別稱或引用,通過該別稱或引用亦便訪問、操作原有數據,但是原有數據不會產生拷貝。如果對視圖進行修改,他就會影響到原有數據(原有數據同時被修改),物理記憶體在同一位置。

副本: 是對一個數據的完整拷貝,如果對副本進行修改,它不會影響到原有數據,物理地址不存在同一個位置。

具體分為:

① 無複製:簡單的複製不會創建數組對象的副本。它使用原始數據的相同id()來訪問它。Id()返回python對象的通用標識符,類似於C中的指針。

一個數組的任何變化都反映在另一個數組上。例如,一個數組的形狀改變另一個數組的形狀。

② 視圖或者淺複製Numpy擁有ndarray.view()方法,是一個新的數組對象,並且可查看原始數組的相同數據。新數組的維數更改不會更改原始數據的維數。

實例:

from numpy import*                       

a=arange(6).reshape(3,2)

print(a)

b=a.view()

print(b)

c=b.reshape(2,3)

print(c)

print(a.shape)      #註意:數組b(新視圖)的維數改變不影響原始數據的維數

print(id(a))

print(id(b))         #兩個數組的id不變

運行結果:

[[0 1]

 [2 3]

 [4 5]]

[[0 1]

 [2 3]

 [4 5]]

[[0 1 2]

 [3 4 5]]

(3, 2)

144810752

144810112

③ 深複製(副本)ndarray.copy()函數創建一個深層副本。是數組及其數據的完整副本,不與原始數據共用。

實例:import numpy as np

a = np.array([[10,10],  [2,3],  [4,5]])  

print  ('數組 a')  

print (a)

print  ('創建 a 的深層副本:' )

b = a.copy()  

print  ('數組 b' )

print (b)

# b a 不共用任何內容  

print  ('我們能夠寫入 b 來寫入 a 嗎?' )

print (b is a )

print  ('修改 b 的內容:')

b[0,0]  =  100  

print  ('修改後的數組 b')  

print (b)

print  ('a 保持不變:')  

print (a)

運算結果:

數組 a

[[10 10]

 [ 2  3]

 [ 4  5]]

創建 a 的深層副本:

數組 b

[[10 10]

 [ 2  3]

 [ 4  5]]

我們能夠寫入 b 來寫入 a 嗎?

False

修改 b 的內容:

修改後的數組 b

[[100  10]

 [  2   3]

 [  4   5]]

a 保持不變:

[[10 10]

 [ 2  3]

 [ 4  5]]

  1. 2.數組比較:

  數組比較是為了檢查兩個矩陣是否彼此接近。

布爾數組:元素是bool類型的數組。任何作用於數組的比較運算都將創建一個布爾數組,而不是布爾值。

例如:M=array([[2.,3.],[1.,4.]])

print(M>2)       #數組的比較運算創建了布爾數組

運行結果為:[[False  True]

               [False  True]]

註意:在條件語句中不能直接使用數組比較,應使用allany方法。

例:

M=array([[2.,3.],[1.,4.]])

N=array([[1.,2.],[3.,3.]])

print(M==N)     #返回布爾數組

print((M==N).all())

print((M!=N).any())     #返回Ture

if (abs(N-M)<1e-10).all():     #abs()函數返回數字的絕對值

print("The two arrays are close enough")        

運行結果:[[False False]

           [False False]]

False

True

相等判斷:兩個浮點數組的相等判斷不是直接進行。在Numpy中用allclose()函數來判斷,該函數判斷了兩個到達精度的數組是否相等。

因為兩個浮點數可能無限接近而不相等。

例如:

data=random.rand(2)*1e-3      #random.rand()生成隨機數組

small_error=random.rand(2)*1e-16

print(data)

print(small_error)

print(data==data+small_error)

print(allclose(data,data+small_error,rtol=1.e-5,atol=1.e-8))     #其誤差是根據相對誤差界限#rtolatol給出的

運行結果:

[2.46971243e-04 6.77622235e-05]

[2.78354596e-17 6.88850359e-17]

[False False]      True

  1. 3 數組索引

1)除去基本的切片技術(見https://www.cnblogs.com/chenzhijuan-324/p/10577513.html)可以通過組合切片和整數來索引數組。這裡介紹使用布爾數組根據數組中的元素的值來訪問和修改數組的一部分。註意:索引操作的結果總是一個向量

例如:

B=array([[True,False],[False,True]])

M=array([[2,3],[1,4]])

print(M[B])                   #根據布爾數組進行索引

M[B]=10,20              #用其他值來替代索引所得的值   

print(M)

M[M>2]=0         #M的所有大於2的元素均被0替代

print(M)

運算結果:

[2 4]

[[10  3]

 [ 1 20]]

[[0 0]

 [1 0]]

  2Where命令:

基本結構:Where(condition,a,b)       該結構將布爾數組作為條件,並返回滿足條件的數組元組的索引,或者根據布爾數組中的值返回不同的值

例如:

x=linspace(-4,4,5)

print(x)

print(where(x>0,sqrt(x),0))

print(where(x>0,1,-1))     #表示若x>0,返回1,否則返回-1

a=arange(9)

b=a.reshape((3,3))

print(b)

print(where(a>5))     #返回一個元組,這個元組包含了滿足條件的元素的索引。

print(where(b>5))   

運行結果:

[-4. -2.  0.  2.  4.]

[0.         0.         0.         1.41421356 2.        ]

[-1 -1 -1  1  1]

[[0 1 2]

 [3 4 5]

 [6 7 8]]

(array([6, 7, 8], dtype=int64),)

(array([2, 2, 2], dtype=int64), array([0, 1, 2], dtype=int64))


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ————看,他已經敲了三次OO作業,精神仍然很好 1. 類的設計反思 筆者三次OO作業,每次都為如何設計類與類間關係而頭痛,回顧三次痛苦經歷,總結出如下原因: 分類不是源於需求而是拘泥於問題的錶面形式。 以第二、三次作業為例,我們將多項式拆分為單項式,繼而拆分為因數,卻難以給出如此拆分的理由。當我們 ...
  • Turtle庫的建立——漢諾塔 1、首先是要用遞歸方法來完成這個漢諾塔法則 2、其次,就要編程好代碼以及熟練掌握Turtle函數庫 一、 相關代碼如下: (盤子最多19個) 二、 試驗結果如下: 三、 實驗說明: 我們可以更改代碼(drawpole_1)這個函數中的 第一個t.goto中400可改為 ...
  • 最近a演算法題的時候碰到一道題:一個數列前三項都為1,之後每項的值等於前三項之和,求第20193024項的最後4位數字。一開始寫的代碼如下: 結果一直爆 Terminated due to signal: SEGMENTATION FAULT (11) 這個錯誤,改了好久沒改出來。之後在stackov ...
  • 什麼是進程 進程是一個可執行的應用程式,任何進程都有一個主線程作為入口,是線程的集合 什麼是多線程 多線程可以提高效率,我們在電腦操作的時候,開多個視窗,並不是多線程併發,是cpu在切換,只不過速度很快,我們感覺不到,多線程是在同一個時刻同時進行 為什麼要使用多線程? 假設你有100桶水,你一個小時 ...
  • 一、實驗目的 熟悉c語言集成開發環境 掌握c程式結構,熟悉c程式編碼規範 掌握c程式編寫、編譯、運行、調試方法 掌握基本數據類型、常量、變數的使用 掌握常用運算符用法,掌握表達式求值規則 二、實驗準備 實驗前,請圍繞以下內容複習教材第1章、第2章相關內容: 1. 一個完整的c程式結構和書寫規範(教材 ...
  • 1.引入依賴 org.springframework.boot spring boot starter parent 1.5.3.RELEASE <! lookup parent from repository org.springframework.boot spring boot starter ...
  • 版權聲明: https://blog.csdn.net/qq_32595075/article/details/80059834一般面試中java Exception(runtimeException )是必會被問到的問題常見的異常列出四五種,是基本要求。更多的。。。。需要註意積累了 常見的幾種如下 ...
  • 一 什麼是元類 一切源自於一句話:python中一切皆為對象。讓我們先定義一個類,然後逐步分析 所有的對象都是實例化或者說調用類而得到的(調用類的過程稱為類的實例化),比如對象t1是調用類OldboyTeacher得到的。 如果一切皆為對象,那麼類OldboyTeacher本質也是一個對象,既然所有 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...