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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...