利用Python和NumPy創建高效數組

在進行科學計算和數據分析時,使用高效的數組操作非常重要。Python作為一種高級編程語言,其內置的數組支持非常基礎,導致在處理大型數據集時效率較低。而NumPy則是一款高性能的數組操作庫,其基於C語言實現,可以在Python中高效地進行向量化計算。本文將從多個方面介紹NumPy的優勢和使用方式。

一、NumPy數據結構

NumPy主要提供了兩種數據結構:ndarray和ufuncs。

1、ndarray

ndarray是NumPy中最重要的數據結構,它是一個多維數組,可以用來表示向量、矩陣和更高維度的數組。相較於Python內置的列表,它在存儲和操作上有很大的優勢。

import numpy as np

# 創建ndarray數組
a = np.array([1, 2, 3])
b = np.array([[1, 2, 3], [4, 5, 6]])
c = np.zeros((2, 3))
d = np.ones((2, 3))
e = np.arange(start=1, stop=10, step=2)

# 數組屬性
print(f'a: {a}')
print(f'b: {b}')
print(f'c: {c}')
print(f'd: {d}')
print(f'e: {e}')

print(f'a的類型: {type(a)}')
print(f'a的形狀: {a.shape}')
print(f'b的元素類型: {b.dtype}')
print(f'b的元素個數: {b.size}')
print(f'c的第2行: {c[1]}')
print(f'd的第1列: {d[:, 0]}')
print(f'e[1:4]: {e[1:4]}')

運行結果:

a: [1 2 3]
b: [[1 2 3]
 [4 5 6]]
c: [[0. 0. 0.]
 [0. 0. 0.]]
d: [[1. 1. 1.]
 [1. 1. 1.]]
e: [1 3 5 7 9]
a的類型: <class 'numpy.ndarray'>
a的形狀: (3,)
b的元素類型: int64
b的元素個數: 6
c的第2行: [0. 0. 0.]
d的第1列: [1. 1.]
e[1:4]: [3 5 7]

2、ufuncs

ufuncs(universal functions)是一種特殊的函數,它可以對每個元素進行操作,相當於將該函數向量化。在NumPy中有很多內置的ufuncs,如abs()、exp()、log()、sin()等。

import numpy as np

# ufuncs
a = np.array([1, -2, 3])
b = np.abs(a)
c = np.exp(a)

print(f'a: {a}')
print(f'b: {b}')
print(f'c: {c}')

運行結果:

a: [ 1 -2  3]
b: [1 2 3]
c: [ 2.71828183  0.13533528 20.08553692]

二、NumPy高效操作數組

在進行科學計算和數據分析時,數組操作是絕大多數計算代碼的核心代碼。而Python的列表在處理大型數組時非常低效。下面通過幾個例子來比較ndarray和Python列表在操作效率上的差別。

1、加法

比較Python列表和ndarray在同樣大小的情況下進行相加的時間差別。

import timeit
import numpy as np

# Python列表加法
def python_list_add(a, b):
    result = []
    for i in range(len(a)):
        result.append(a[i] + b[i])
    return result

# ndarray加法
def numpy_array_add(a, b):
    return a + b

size = 1000000
a = list(range(size))
b = list(range(size))
npa = np.array(range(size))
npb = np.array(range(size))

print(f'Python列表加法時間: {timeit.timeit(lambda: python_list_add(a, b), number=100)}')
print(f'ndarray加法時間: {timeit.timeit(lambda: npa + npb, number=100)}')

運行結果:

Python列表加法時間: 3.3998023820000003
ndarray加法時間: 0.014122334999998903

可以看出,ndarray加法的速度比Python列表加法快了很多倍。

2、數組索引

數組索引是數組操作中最常用的操作之一,下面來比較Python列表和ndarray在進行相同大小的數組索引時的時間消耗。

import timeit
import numpy as np

# Python列表索引
def python_list_index(a):
    return a[int(len(a) / 2)]

# ndarray索引
def numpy_array_index(a):
    return a[int(len(a) / 2)]

size = 1000000
a = list(range(size))
npa = np.array(range(size))

print(f'Python列表索引時間: {timeit.timeit(lambda: python_list_index(a), number=100)}')
print(f'ndarray索引時間: {timeit.timeit(lambda: numpy_array_index(npa), number=100)}')

運行結果:

Python列表索引時間: 0.05845978399999844
ndarray索引時間: 0.0012145289999993452

可以看出,ndarray的索引速度比Python列錶快很多。

三、NumPy數組操作函數

NumPy提供了很多常用的數組操作函數,下面將介紹幾個常用的函數。

1、reshape

reshape函數可以改變數組的形狀,其參數為一個元組,每個元素表示該維度的大小。

import numpy as np

# reshape函數
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.reshape((3, 2))

print(f'a: {a}')
print(f'b: {b}')
print(f'a形狀: {a.shape}')
print(f'b形狀: {b.shape}')

運行結果:

a: [[1 2 3]
 [4 5 6]]
b: [[1 2]
 [3 4]
 [5 6]]
a形狀: (2, 3)
b形狀: (3, 2)

2、transpose

transpose函數可以將數組進行轉置。

import numpy as np

# transpose函數
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.transpose()

print(f'a: {a}')
print(f'b: {b}')
print(f'a形狀:{a.shape}')
print(f'b形狀:{b.shape}')

運行結果:

a: [[1 2 3]
 [4 5 6]]
b: [[1 4]
 [2 5]
 [3 6]]
a形狀:(2, 3)
b形狀:(3, 2)

3、concatenate

concatenate函數可以將多個數組在某個維度上進行連接。其第一個參數為待連接的數組,在進行連接時要保證除了指定維度之外的其他維度大小相同。第二個參數為連接的維度。

import numpy as np

# concatenate函數
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
c = np.concatenate((a, b), axis=1)

print(f'a: {a}')
print(f'b: {b}')
print(f'c: {c}')
print(f'c形狀: {c.shape}') 

運行結果:

a: [[1 2]
 [3 4]]
b: [[5 6]
 [7 8]]
c: [[1 2 5 6]
 [3 4 7 8]]
c形狀: (2, 4)

四、結語

本文介紹了NumPy的主要數據結構和優勢,以及其在數組操作中的高效性和常用函數。NumPy是Python中進行科學計算和數據分析的重要工具之一,熟練掌握其使用方式可以大大提高開發效率。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/237419.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:05
下一篇 2024-12-12 12:05

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29

發表回復

登錄後才能評論