深入解析NumPy的核心函數np.array()

深入解析NumPy的核心函數np.array

    • NumPy與np.array()簡介
      • NumPy的重要性
      • np.array()的作用
    • np.array()函數的詳細參數
      • object參數
      • dtype參數
      • copy參數
      • order參數
      • subok參數
      • ndmin參數
      • like參數
    • np.array()函數的使用示例
      • 創建基本的一維和二維數組
      • 創建具有特定數據類型的數組
      • 創建多維數組
      • 從其他數據結構轉換為數組
      • 使用ndmin參數創建具有最小維度的數組
    • np.array()函數與與Python原生列表的比較

NumPy為Python提供了高效的多維數組對象以及一系列用于處理這些數組的工具,極大地簡化了數值計算的過程。而np.array()作為NumPy庫的核心函數之一,是創建和操作數組的基礎。

NumPy與np.array()簡介

NumPy(Numerical Python的簡稱)是Python中用于處理數組運算的擴展庫,它提供了大量的數學函數來操作數組,使得數組的處理變得高效且簡潔。np.array()則是NumPy庫中的一個基礎函數,用于創建數組。

NumPy的重要性

NumPy在科學計算、數據分析、機器學習等眾多領域都有著廣泛的應用。它的高效性源于其底層使用C語言實現,能夠充分利用計算機的硬件資源,對數組進行快速的運算。與Python原生的列表相比,NumPy數組在內存中是連續存儲的,這使得數組元素之間的訪問和計算更為高效。例如,在進行大規模的數據處理時,使用NumPy數組可以顯著提高程序的運行速度。

np.array()的作用

np.array()函數的主要作用是將Python中的各種數據結構(如列表、元組等)轉換為NumPy數組,或者根據指定的參數創建一個新的數組。通過np.array()創建的數組可以方便地進行各種數學運算、索引和切片操作,為后續的數據處理和分析提供了基礎。

np.array()函數的詳細參數

np.array()函數的完整語法為:numpy.array(object, dtype = None, *, copy = True, order = 'K', subok = False, ndmin = 0, like = None)。下面我們來詳細介紹每個參數的含義和用法。

object參數

object參數是必填項,它表示要轉換為數組的對象,可以是一個數組、任何暴露數組接口的對象、其__array__方法返回數組的對象,或者任何(嵌套的)序列。如果object是一個標量,則返回一個包含該標量的0維數組。

例如,我們可以使用列表來創建一個一維數組:

import numpy as np
arr_1d = np.array([1, 2, 3, 4, 5])
print(arr_1d)

輸出結果為:[1 2 3 4 5]

也可以使用嵌套列表來創建一個二維數組:

arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr_2d)

輸出結果為:

[[1 2 3][4 5 6][7 8 9]]

dtype參數

dtype參數用于指定數組的數據類型,它是可選的。如果不指定dtype,NumPy會根據傳入的數據自動推斷出合適的數據類型。例如:

arr = np.array([1, 2, 3])
print(arr.dtype)

輸出結果為:int64

在這個例子中,由于傳入的數據都是整數,NumPy自動推斷出數組的數據類型為int64

然而,在某些情況下,我們可能需要顯式地指定數據類型,以滿足特定的需求。比如,當我們需要創建一個包含浮點數的數組時,可以這樣做:

arr_float = np.array([1, 2, 3], dtype = np.float32)
print(arr_float.dtype)

輸出結果為:float32

通過指定dtype = np.float32,我們創建了一個數據類型為32位浮點數的數組。

指定數據類型的好處之一是可以優化內存使用。例如,如果我們知道數組中的數據范圍較小,并且不需要高精度的計算,可以使用較小的數據類型,如int8float16,這樣可以減少內存的占用。

copy參數

copy參數用于控制是否復制數據,它是一個布爾值,默認為True。當copy = True時,無論輸入數據的來源如何,都會創建一個數據的副本;當copy = False時,如果輸入數據本身就是一個NumPy數組,并且不需要進行任何數據類型轉換或其他修改,那么將不會復制數據,而是直接使用原數組的引用。

需要注意的是,當copy = None時,只有在__array__返回副本、obj是嵌套序列或需要滿足其他要求(如dtypeorder等)時才會進行復制。

例如,下面的代碼中,由于輸入數據是一個列表,所以無論copy參數的值如何,都會創建一個新的數組副本:

list_data = [1, 2, 3]
arr1 = np.array(list_data, copy = True)
arr2 = np.array(list_data, copy = False)
arr3 = np.array(list_data, copy = None)
print(arr1 is arr2)  # False
print(arr1 is arr3)  # False

輸出結果均為False,說明arr1arr2arr3都是不同的數組對象。

而當輸入數據是一個NumPy數組時,如果copy = False且不需要進行其他修改,那么將不會復制數據:

arr4 = np.array([1, 2, 3])
arr5 = np.array(arr4, copy = False)
print(arr4 is arr5)  # True

輸出結果為True,說明arr4arr5指向同一個數組對象。

order參數

order參數用于指定數組在內存中的存儲順序,它有四個可選值:'K''A''C''F'

  • 'C'表示按C語言的行優先順序存儲,即先存儲第一行,再存儲第二行,以此類推。
  • 'F'表示按Fortran語言的列優先順序存儲,即先存儲第一列,再存儲第二列,以此類推。
  • 'A'表示如果輸入數據是Fortran連續的,則按'F'順序存儲,否則按'C'順序存儲。
  • 'K'表示盡可能保持輸入數據的原始順序。

默認情況下,order = 'K'

例如,我們可以通過order參數來控制二維數組的存儲順序:

arr_2d_c = np.array([[1, 2, 3], [4, 5, 6]], order = 'C')
arr_2d_f = np.array([[1, 2, 3], [4, 5, 6]], order = 'F')
print(arr_2d_c.flags)
print(arr_2d_f.flags)

輸出結果分別為:

C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False

從輸出結果可以看出,arr_2d_c是按行優先順序存儲的(C_CONTIGUOUS : True),而arr_2d_f是按列優先順序存儲的(F_CONTIGUOUS : True)。

subok參數

subok參數是一個布爾值,默認為False。當subok = True時,返回的數組將保留輸入數據的子類類型;當subok = False時,無論輸入數據的類型如何,返回的數組都將被強制轉換為基類ndarray類型。

例如,假設我們有一個自定義的數組子類MyArray,它繼承自np.ndarray

class MyArray(np.ndarray):pass
data = MyArray([1, 2, 3])
arr1 = np.array(data, subok = True)
arr2 = np.array(data, subok = False)
print(type(arr1))  # <class '__main__.MyArray'>
print(type(arr2))  # <class 'numpy.ndarray'>

輸出結果表明,當subok = True時,arr1仍然是MyArray類型;而當subok = False時,arr2被轉換為了np.ndarray類型。

ndmin參數

ndmin參數用于指定返回數組的最小維度,它是一個整數,默認為0。如果輸入數據的維度小于ndmin,則會在數組的形狀前面添加一維,直到滿足最小維度的要求。

例如:

arr1 = np.array([1, 2, 3], ndmin = 1)
arr2 = np.array([1, 2, 3], ndmin = 2)
arr3 = np.array([1, 2, 3], ndmin = 3)
print(arr1.shape)  # (3,)
print(arr2.shape)  # (1, 3)
print(arr3.shape)  # (1, 1, 3)

在這個例子中,輸入數據[1, 2, 3]是一個一維數組。當ndmin = 1時,數組形狀不變;當ndmin = 2時,在前面添加了一維,變成了二維數組(1, 3);當ndmin = 3時,在前面添加了兩維,變成了三維數組(1, 1, 3)

like參數

like參數是在NumPy 1.20.0版本中新增的,它用于指定一個參考對象,以便創建與該對象兼容的數組。如果傳入的like參數支持__array_function__協議,那么結果將由該協議定義。

例如:

arr = np.array([1, 2, 3])
new_arr = np.array([4, 5, 6], like = arr)
print(type(new_arr))  # <class 'numpy.ndarray'>

在這個例子中,我們以arr為參考對象,創建了一個新的數組new_arrnew_arr的類型與arr相同,都是np.ndarray

np.array()函數的使用示例

創建基本的一維和二維數組

如前文所述,使用np.array()函數可以很方便地創建一維和二維數組。
創建一維數組:

arr_1d = np.array([1, 2, 3, 4, 5])
print(arr_1d)

創建二維數組:

arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr_2d)

創建具有特定數據類型的數組

通過dtype參數,我們可以創建具有特定數據類型的數組。
創建整數類型的數組:

arr_int = np.array([1, 2, 3], dtype = np.int16)
print(arr_int.dtype)

創建浮點數類型的數組:

arr_float = np.array([1.0, 2.0, 3.0], dtype = np.float64)
print(arr_float.dtype)

創建復數類型的數組:

arr_complex = np.array([1 + 1j, 2 + 2j, 3 + 3j], dtype = np.complex128)
print(arr_complex.dtype)

創建多維數組

np.array()函數不僅可以創建一維和二維數組,還可以創建更高維度的數組。只需在傳入的序列中嵌套更多的層級即可。
創建三維數組:

arr_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr_3d)

輸出結果為:

[[[1 2][3 4]][[5 6][7 8]]]

從其他數據結構轉換為數組

除了使用列表和元組來創建數組外,np.array()函數還可以將其他數據結構轉換為數組。
將集合轉換為數組:

set_data = {1, 2, 3, 3}  # 集合會自動去重
arr_set = np.array(set_data)
print(arr_set)

輸出結果為:[1 2 3]

將字符串轉換為數組:

str_data = "hello"
arr_str = np.array(list(str_data))
print(arr_str)

輸出結果為:['h' 'e' 'l' 'l' 'o']

使用ndmin參數創建具有最小維度的數組

通過ndmin參數,我們可以確保創建的數組具有指定的最小維度。

arr1 = np.array([1, 2, 3], ndmin = 2)
print(arr1.shape)  # (1, 3)
arr2 = np.array([1, 2, 3], ndmin = 3)
print(arr2.shape)  # (1, 1, 3)

np.array()函數與與Python原生列表的比較

雖然Python原生列表也可以存儲多個元素,但與NumPy數組相比,它們有很多不同之處。

  1. 內存存儲:NumPy數組在內存中是連續存儲的,而Python列表是離散存儲的。這使得NumPy數組在進行數值計算時能夠更高效地利用內存,提高計算速度。
  2. 數據類型:NumPy數組中的所有元素必須是同一數據類型,而Python列表可以包含不同數據類型的元素。這使得NumPy數組在進行數學運算時更加高效,因為不需要進行類型檢查和轉換。
  3. 運算效率:由于NumPy數組的內存存儲方式和數據類型的一致性,NumPy提供了大量的優化函數,能夠對數組進行快速的數學運算。相比之下,使用Python原生列表進行相同的運算需要編寫循環,效率較低。

例如,計算兩個數組的元素之和:

import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
result_np = arr1 + arr2
print(result_np)

輸出結果為:[5 7 9]

而使用Python原生列表實現相同的功能:

list1 = [1, 2, 3]
list2 = [4, 5, 6]
result_list = []
for i in range(len(list1)):result_list.append(list1[i] + list2[i])
print(result_list)

輸出結果為:[5, 7, 9]

可以看到,使用NumPy數組的代碼更加簡潔,且在處理大規模數據時,運算效率會更高。

That’s all, thanks for reading!
覺得有用就點個贊、收進收藏夾吧!關注我,獲取更多干貨~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87154.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87154.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87154.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

定時器的設計

定時器 定時器原理如何理解定時器定時器數據結構選取定時器觸發方式 定時器的實現 定時器原理 如何理解定時器 定時器在日常通常被描述為組織大量延時任務的模塊&#xff0c;其實從字面意思去理解的話&#xff0c;他就是去處理延時任務的&#xff0c;那么什么是延時任務呢&am…

大模型-分布式論文一瞥

1分離式架構 1.1 DistServe DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving 講的是一個將prefill和decoding分…

02.SpringBoot常用Utils工具類詳解

文章目錄 1. BeanUtils詳解1.1 什么是BeanUtils&#xff1f;1.2 主要的BeanUtils實現1.2.1 Spring BeanUtils1.2.2 Apache Commons BeanUtils1.2.3 其他實現 1.3 Spring BeanUtils詳細使用1.3.1 基本用法1.3.2 指定忽略屬性1.3.3 批量拷貝&#xff08;列表轉換&#xff09; 1.4…

Golang快速開發框架——項目立項與系統配置讀取組件viper(一)

Golang快速開發框架——項目立項與系統配置讀取組件viper&#xff08;一&#xff09; 背景 知識分享之Golang篇是我在日常使用Golang時學習到的各種各樣的知識的記錄&#xff0c;將其整理出來以文章的形式分享給大家&#xff0c;來進行共同學習。歡迎大家進行持續關注。 知識分…

打造可觀測的 iOS CICD 流程:調試、追蹤與質量保障全記錄

隨著iOS項目復雜度增加&#xff0c;團隊越來越依賴自動化構建、自動化測試等CI/CD流程來保證產品質量。但CI/CD環境下&#xff0c;很多線下調試手段無法直接使用&#xff0c;比如&#xff1a; 無法手動連真機跑Instruments測試包只在分發后才能拿到崩潰模擬器上表現和真機不一…

C++11中 <cinttypes>的入門與精通

文章目錄 一、<cinttypes> 是什么1. 固定寬度的整數類型2. 整數操作函數3. 格式化輸入輸出宏 二、深入理解 <cinttypes>1. 固定寬度整數類型的使用2. 整數操作函數的使用3. 格式化輸入輸出宏的使用 三、實踐和技巧1. 使用固定寬度整數類型的最佳實踐2. 使用整數操作…

Pytorhc Lightning進階:一篇實例玩轉Pytorhc Lightning 讓訓練更高效

Pytorhc Lightning進階&#xff1a;一篇實例玩轉Pytorhc Lightning 讓訓練更高效 Pytorhc Lightning 主要包含以下幾大類&#xff0c;主要圍繞以下講解&#xff1a; 模型&#xff0c;PyTorch Lightning 的核心是繼承 pl.LightningModule數據&#xff0c;數據模塊繼承pl.Light…

大模型算法面試筆記——注意力Transformer流程/面試題篇

學習資料來源于字母站大學 1 Transformer架構 基于編碼器-解碼器的架構來處理序列對。跟使用注意力的seq2seq不同&#xff0c;Transformer是基于純注意力。 2 注意力 2.1 自注意力機制 使用注意力&#xff1a;需要根據整個序列進行預測&#xff0c;對于同一input&#xf…

Rust 定義與實例化結構體

文章目錄 Rust 定義與實例化結構體5.1 結構體的定義與意義5.2 結構體實例化5.2.1 基本實例化5.2.2 可變性規則5.2.3 字段初始化簡寫5.2.4 結構體更新語法 5.3 特殊結構體類型5.3.1 元組結構體&#xff08;Tuple Struct&#xff09;5.3.2 類單元結構體&#xff08;Unit-Like Str…

ELK日志分析系統(filebeat+logstash+elasticsearch+kibana)

一、ELK 平臺介紹 1、ELK 概述 日志主要包括系統日志、應用程序日志和安全日志。系統運維和開發人員可以通過日志了解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日志可以了解服務器的負荷&#xff0c;性能安全性&#xff0c;從而及時采取措施糾正錯誤。…

JS基礎4—jQuery

jQuery常用內容 jQuery 介紹jQuery 獲取方式基本選擇器 (最常用)層級選擇器 (基于元素間關系)過濾選擇器 (基于特定條件) jQuery事件綁定jQuery 方法調用jQuery遍歷jQuery 獲取與設置jQuery 添加與刪除jQuery CSS 類jQuery - AJAX 總結 jQuery 介紹 jQuery 是一個輕量級、快速…

時鐘周期是什么?

時鐘周期&#xff08;Clock Cycle&#xff09;是什么&#xff1f; 時鐘周期&#xff08;Clock Cycle&#xff09;是計算機系統中一個最基礎的時間單位&#xff0c;也稱為時鐘節拍或時鐘周期時間&#xff08;Clock Period&#xff09;。它由系統時鐘發生器產生的一個周期性脈沖…

如何用SEO優化長尾關鍵詞?

內容概要 在SEO優化領域&#xff0c;長尾關鍵詞扮演著至關重要的角色&#xff0c;它們能有效提升網站在搜索引擎中的可見度和流量轉化率。本文將全面解析如何通過系統方法優化長尾關鍵詞&#xff0c;涵蓋從基礎理論到實戰應用的完整流程。核心內容包括利用專業工具進行關鍵詞挖…

電子面單系統開發全解析

一、如果要做電子面單系統&#xff0c;怎么做&#xff1f; 開發電子面單系統是一項復雜且涉及多方面考量的工程&#xff0c;涵蓋需求分析、系統架構設計、技術選型、接口對接、安全性保障、第三方服務選擇以及部署與維護等關鍵環節。 電子面單系統開發步驟 需求分析&#xf…

UE5 - 制作《塞爾達傳說》中林克的技能 - 18 - 磁力抓取器

讓我們繼續《塞爾達傳說》中林克技能的制作!!! UE版本:5.6.0 VS版本:2022 本章節的核心目標:磁力抓取器 先讓我們看一下完成后的效果: 18_磁力抓取器 大綱如下: 引言功能架構與核心邏輯物理材質與場景配置代碼實現:從識別到操控操作說明1.引言 在《塞爾達傳說》中,林…

基于ApachePOI實現百度POI分類快速導入PostgreSQL數據庫實戰

目錄 前言 一、百度POI分類簡介 1、數據表格 2、分類結構 二、從Excel導入到PG數據庫 1、Excel解析流程 2、數據入庫 3、入庫成果及檢索 三、總結 前言 在上一篇博文中&#xff0c;我們對高德POI分類進行了深入剖析 并對Excel 中 POI 分類數據的存儲結構特點進行了詳細介…

學習經驗分享【41】YOLOv13:基于超圖增強自適應視覺感知的實時目標檢測

YOLO算法更新速度很快&#xff0c;已經出到V13版本&#xff0c;后續大家有想發論文或者搞項目可更新自己的baseline了。 摘要&#xff1a;YOLO 系列模型憑借其卓越的精度和計算效率&#xff0c;在實時目標檢測領域占據主導地位。然而&#xff0c;YOLOv11 及早期版本的卷積架構&…

Handling outliers in non-blind image deconvolution論文閱讀

Handling outliers in non-blind image deconvolution 1. 研究目標與實際意義2. 創新方法:基于EM的異常值建模2.1 新模糊模型2.1.1 目標函數2.2 EM框架:迭代優化二元掩碼2.2.1 E步:計算后驗權重 E [ m x ] E[m_x] E[mx?]2.2.2 M步:加權正則化反卷積2.3 優化加速技術2.3.1…

Redis 功能擴展:Lua 腳本對 Redis 的擴展

Redis 是一個高性能的內存數據庫&#xff0c;支持多種數據結構&#xff0c;如字符串、哈希、列表、集合和有序集合。為了增強其功能&#xff0c;Redis 引入了 Lua 腳本支持&#xff0c;使開發者可以編寫自定義的腳本&#xff0c;確保操作的原子性并提高復雜操作的性能。本文將詳…

七天學完十大機器學習經典算法-06.支持向量機(SVM):分類邊界的藝術——深入淺出指南

接上一篇《七天學完十大機器學習經典算法-05.從投票到分類&#xff1a;K近鄰(KNN)算法完全指南》 想象你要在操場上為兩個班級劃活動區域&#xff0c;如何畫出一條最公平的分界線&#xff1f;這條線不僅要分開兩班學生&#xff0c;還要讓兩個班都離分界線盡可能遠——這就是支持…