NumPy 學習筆記(三)

来源:https://www.cnblogs.com/lemonyam/archive/2019/04/25/10756891.html
-Advertisement-
Play Games

NumPy 數組操作: 1、修改數組形狀 a、numpy.reshape(arr, newshape, order='C') 在不改變數據的條件下修改形狀 b、numpy.ndarray.flat 是一個數組元素迭代器 c、numpy.ndarray.flatten(self, order) 返回一 ...


NumPy 數組操作:

  1、修改數組形狀

    a、numpy.reshape(arr, newshape, order='C') 在不改變數據的條件下修改形狀

    b、numpy.ndarray.flat 是一個數組元素迭代器

    c、numpy.ndarray.flatten(self, order) 返回一份數組拷貝,對拷貝數組修改不會影響原數組

    d、numpy.ravel(a, order='C') 展開數組元素,順序通常是 "C 風格",返回的是數組視圖,即修改會影響原始數組

import numpy as np

# 將 1 維數組改變為形狀為 2*5 的數組
arr = np.arange(10).reshape(2, 5)
print("arr: ", arr)

for elem in arr.flat:
    elem = elem + 1
    print(elem, end=" ")        # 1 2...10
# 原數組未改變!!!
print("\narr: ", arr)

arr.shape = (5, 2)
# [0 1 2 3 4 5 6 7 8 9]
print("Order is C: ", arr.flatten())
# [0 2 4 6 8 1 3 5 7 9]
print("Order is F: ", arr.flatten(order="F"))

temp = arr.ravel()
print("arr: ", temp)
# 修改了展開數組下標為 2 的元素
arr.ravel()[2] = 10
print("arr: ", arr)     # arr 發生改變

 

  2、翻轉數組

    a、numpy.transpose(arr, axes) 用於對換數組的維度

    b、numpy.ndarray.T 類似 numpy.transpose()

    c、numpy.rollaxis(arr, axis, start) 向後滾動特定的軸到一個特定位置

    d、numpy.swapaxes(arr, axis1, axis2) 用於交換數組的兩個軸

import numpy as np

# numpy.transpose(arr, axes) 用於對換數組的維度
arr = np.arange(1, 11).reshape(5, 2)
print("transpose arr: ", np.transpose(arr))
# numpy.ndarray.T 類似 numpy.transpose()
print("arr.T: ", arr.T)

# numpy.rollaxis(arr, axis, start) 向後滾動特定的軸到一個特定位置
arr = np.arange(4).reshape(2, 2)
print("rollaxis arr: ", np.rollaxis(arr, axis=1))       # [[0 2] [1 3]]
# numpy.swapaxes(arr, axis1, axis2) 用於交換數組的兩個軸
print("swapaxes arr: ", np.swapaxes(arr, 1, 0))     # [[0 2] [1 3]]

 

  3、修改數組維度

    a、numpy.broadcast 用於模仿廣播的對象,它返回一個對象,該對象封裝了將一個數組廣播到另一個數組的結果

    b、numpy.broadcast_to(array, shape, subok=False) 函數將數組廣播到新形狀。它在原始數組上返回只讀視圖,通常不連續。 如果新形狀不符合 NumPy 的廣播規則,該函數可能會拋出ValueError

    c、numpy.expand_dims(arr, axis) 通過在指定位置插入新的軸來擴展數組形狀

    d、numpy.squeeze(arr, axis) 從給定數組的形狀中刪除一維的條目

import numpy as np

# numpy.broadcast 用於模仿廣播的對象,它返回一個對象,該對象封裝了將一個數組廣播到另一個數組的結果
x = np.array([[1], [2], [3]])
y = np.array([4, 5, 6])
# 它擁有 iterator 屬性,基於自身組件的迭代器元組
# 發生廣播,[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
b = np.broadcast(x, y)
c = np.empty(b.shape)       # 生成形狀如 b 的隨機數組

print(c.shape)
print('手動使用 broadcast 將 x 與 y 相加:')
c.flat = [u + v for (u, v) in b]
print("x+y: ", c)
# 若把下麵 b 的代碼註釋掉時輸出空列表,以為迭代器指向末尾
b = np.broadcast(x, y)
lst = [o for o in b]
print("lst: ", lst)

# numpy.broadcast_to(array, shape, subok) 將數組廣播到新形狀。它在原始數組上返回只讀視圖,通常不連續
a = np.array([[1], [2], [3]])
b = np.broadcast_to(a, (3, 2))      # [[1 1] [2 2] [3 3]]
print("b: ", b)

# numpy.expand_dims(arr, axis) 通過在指定位置插入新的軸來擴展數組形狀
a = np.array([[1, 2], [3, 4]])
print("shape of a: ", a.shape)      # (2, 2)
# 可以將 axis 看成數組形狀元組的下標,在對應下標插入新軸
b = np.expand_dims(a, axis=0)
print("b: ", b)     # [[[1 2] [3 4]]]
print("shape of b: ", b.shape)      # (1, 2, 2)

b = np.expand_dims(a, axis=1)
print("b: ", b)     # [[[1 2]] [[3 4]]]
print("shape of b: ", b.shape)      # (2, 1, 2)

# numpy.squeeze(arr, axis) 從給定數組的形狀中刪除一維的條目
x = np.arange(9).reshape(1, 3, 3)
print("x: ", x)
print("shape of x: ", x.shape)      # (1, 3, 3)
# 註意是一維的條目,若在這裡 axis=1 則會報錯,以為 axis=1 軸不為 1
y = np.squeeze(x, axis=0)
print("y: ", y)
print("shape of y: ", y.shape)      # (3, 3)

 

  4、連接數組

    anumpy.concatenate((a1, a2, ...), axis用於沿指定軸連接相同形狀的兩個或多個數組

    b、numpy.stack(arrays, axis=0, out=None用於沿新軸連接數組序列

    c、numpy.hstack((a1, a2, ...)) 是 numpy.stack 函數的變體,它通過水平堆疊來生成數組

    d、numpy.vstack((a1, a2, ...)) 是 numpy.stack 函數的變體,它通過垂直堆疊來生成數組

import numpy as np

# numpy.concatenate((a1, a2, ...), axis) 用於沿指定軸連接相同形狀的兩個或多個數組
a = np.array([[1, 2], [5, 6]])
b = np.array([[3, 4], [7, 8]])
# [[1 2 3 4] [5 6 7 8]]
print("使用 1 軸連接 2 個數組: ", np.concatenate((a, b), axis=1))

# numpy.stack(arrays, axis) 用於沿新軸連接數組序列,arrays相同形狀的數組序列
# [[1 2] [5 6] [3 4] [7 8]]
print("使用 0 軸堆疊 2 個數組: ", np.concatenate((a, b), axis=0))

# numpy.hstack((a1, a2, ...)) 是 numpy.stack 函數的變體,它通過水平堆疊來生成數組
# [[1 2 3 4] [5 6 7 8]]
print("水平堆疊: ", np.hstack((a, b)))

# numpy.vstack((a1, a2, ...)) 是 numpy.stack 函數的變體,它通過垂直堆疊來生成數組
# [[1 2] [5 6] [3 4] [7 8]]
print("垂直堆疊: ", np.vstack((a, b)))

 

  5、分割數組

    a、numpy.split(ary, indices_or_sections, axis沿特定的軸將數組分割為子數組

    b、numpy.hsplit(ary, indices_or_sections) 用於水平分割數組,通過指定要返回的相同形狀的數組數量來拆分原數組

    c、numpy.vsplit(ary, indices_or_sections) 用於垂直分割數組,其分割方式與hsplit用法相同

import numpy as np

#
numpy.split(ary, indices_or_sections, axis) 沿特定的軸將數組分割為子數組 # indices_or_sections:果是一個整數,就用該數平均切分,如果是一個數組,為沿軸切分的位置(左開右閉) arr = np.linspace(1, 100, 10) print("每個子數組長度為 2 分割:", np.split(arr, 5)) # 分割成 arr[0...2) arr[2...4) arr[4...7) arr[7...-1] print("按特定下標分割:", np.split(arr, [2, 4, 7])) # numpy.hsplit(ary, indices_or_sections) 函數用於水平分割數組,通過指定要返回的相同形狀的數組數量來拆分原數組 arr = arr.reshape(2, 5) print("After reshape arr: ", arr) print("hsplit the arr: ", np.hsplit(arr, 5)) # numpy.vsplit(ary, indices_or_sections) 沿著垂直軸分割,其分割方式與 hsplit 用法相同 print("vsplit the arr: ", np.vsplit(arr, 2))

 

  6、數組元素的添加與刪除

    a、numpy.resize(arr, shape) 返回指定大小的新數組;若新數組大小大於原始大小,則包含原始數組中的元素的副本

    b、numpy.append(arr, values, axis=None) 在數組的末尾添加值

    c、numpy.insert(arr, obj, values, axis=None在給定索引之前,沿給定軸在輸入數組中插入值,obj 為索引

    d、numpy.delete(arr, obj, axis) 返回從輸入數組中刪除指定子數組的新數組,obj 為索引

    e、numpy.unique(arr, return_index, return_inverse, return_counts用於去除數組中的重覆元素

 

import numpy as np

# numpy.resize(arr, shape) 返回指定大小的新數組;若新數組大小大於原始大小,則包含原始數組中的元素的副本
arr = np.sin(np.array([0, 30, 45, 60, 90, 120, 135, 150, 180]).reshape(3, 3) * np.pi/180)
np.set_printoptions(precision=1)        # 保留小數點後一位
print("resize(arr, (1, 9)): ", np.resize(arr, (1, 9)))
# 大小大於原始大小,將數組的頭 3 個的副本保存到最後一行
print("resize(arr, (4, 3)): ", np.resize(arr, (4, 3)))
# 保存數組第一個元素的副本到末尾
print("resize(arr, (2, 5)): ", np.resize(arr, (2, 5)))
np.set_printoptions(precision=8)        # 預設為 8

# numpy.append(arr, values, axis=None) 在數組的末尾添加值
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 當axis無定義時,是橫向加成,返回總是為一維數組
# [1 2 3 4 5 6 7 8 9]
print("append(arr, [7, 8, 9]): ", np.append(arr, [7, 8, 9]))
# 按 0 軸加成,列數要相同,還有就是追加的是二維數組
# [[1 2 3] [4 5 6] [7 8 9]]
print("append(arr, [7, 8, 9], axis=0): ", np.append(arr, [[7, 8, 9]], axis=0))
# 註意行數要相同,[[1 2 3 4 5 6] [4 5 6 7 8 9]]
print("append(arr, [[4, 5, 6], [7, 8, 9]], axis=1): ", np.append(arr, [[4, 5, 6], [7, 8, 9]], axis=1))

# numpy.insert(arr, obj, values, axis) 在給定索引之前,沿給定軸在輸入數組中插入值
arr = np.array([1, 2, 3, 4, 5, 6]).reshape(3, 2)
# 如果未提供軸,則輸入數組會被展開
print("insert(arr, 3, [6, 6, 6]): ", np.insert(arr, 3, [6, 6, 6]))
print("insert(arr, 3, [7, 8], axis=0): ", np.insert(arr, 3, [7, 8], axis=0))
# 若形狀不匹配,還會試圖廣播數組
print("insert(arr, 1, [6], axis=1): ", np.insert(arr, 1, [6], axis=1))

# numpy.delete(arr, obj, axis) 返回從輸入數組中刪除指定子數組的新數組
# 如果未提供軸,則輸入數組會被展開
print("delete(arr, 2): ", np.delete(arr, 2))
# 分別按 0 軸和 1 軸刪除下標為 1 的元素
print("delete(arr, 1, axis=0): ", np.delete(arr, 1, axis=0))
print("delete(arr, 1, axis=1): ", np.delete(arr, 1, axis=1))

# numpy.unique(arr, return_index, return_inverse, return_counts) 用於去除數組中的重覆元素
arr = np.array([5, 3, 4, 2, 2, 1, 9, 0, 3, 4])
print("unique(arr): ", np.unique(arr))
# 若 return_index=True 則返回新元素在舊數組中(第一個符合的元素)的下標
print("unique(arr, return_index=True): ", np.unique(arr, return_index=True))
# 若 return_inverse=True 則返回舊數組元素在新數組中的下標
print("unique(arr, return_inverse=True): ", np.unique(arr, return_inverse=True))
# 若 return_counts=True 則返回對應元素在原數組中出現的次數
print("unique(arr, return_counts=True): ", np.unique(arr, return_counts=True))

 


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

-Advertisement-
Play Games
更多相關文章
  • 為什麼需要容錯限流 複雜分散式系統通常有很多依賴,如果一個應用不能對來自依賴 故障進行隔離,那麼應用本身就處在被拖垮的風險中。在一個高流量的網站中,某個單一後端一旦發生延遲,將會在數秒內導致 所有應用資源被耗盡(一個臭雞蛋影響一籃筐)。 如秒殺、搶購、雙十一等場景,在某一時間點會有爆髮式的網路流量涌 ...
  • Python基礎語法(三) 1. 數值型數據結構 1.1 要點 在之前的博客也有提到,數值型數據結構在這裡就不過多介紹了。在這裡提及一些需要知道的知識點。 int、float、complex、bool都是類,1\3.14\2+3j都對象(即實例)。這也符合Python一切皆對象的原則。 int: 在 ...
  • 一、什麼是消息隊列 我們可以把消息隊列比作是一個存放消息的容器,當我們需要使用消息的時候可以取出消息供自己使用。消息隊列是分散式系統中重要的組件,使用消息隊列主要是為了通過非同步處理提高系統性能和削峰、降低系統耦合性。目前使用較多的消息隊列有ActiveMQ,RabbitMQ,Kafka,Rocket ...
  • 下麵是golang實現的簡單優先隊列,參考信息可以查看https://golang.org/pkg/container/heap/或者https://golang.google.cn/pkg/container/heap/,後面這個網址也是官方提供的網址,關於這個網頁的說明,可以參考https:// ...
  • 01、 來看網路上對介面的一番解釋: 介面(英文:Interface),在 Java 編程語言中是一個抽象類型,是抽象方法的集合。一個類通過繼承介面的方式,從而來繼承介面的抽象方法。 兄弟們,你們怎麼看,這段解釋把我繞得暈乎乎的,好像喝過一斤二鍋頭。到底是解釋抽象類呢還是介面呢?傻傻分不清楚。 搞不 ...
  • 昨天在星球的【從零單排】系列分享了一篇【字典存儲結構的實現方式】,我覺得這篇文章寫的還是蠻好的,就分享給大家了。 ...
  • php的會話控制,什麼是會話控制,http等。 什麼是會話控制思想,http協議。 cookie 和 session http是超文本傳輸協議,是網路上最廣泛的一種網路協議。 http最大特點是無連接無狀態,clinet到http request到server,server到http respons ...
  • 一、什麼是MVC MVC即Model-View-Controller(模型-視圖-控制器)是一種軟體設計模式,最早出現在Smalltalk語言中,後被Sun公司推薦為Java EE平臺的設計模式。 MVC把應用程式分成了上面3個核心模塊,這3個模塊又可被稱為業務層-視圖層-控制層。顧名思義,它們三者 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...