深入理解NumPy中的np.nditer

一、np.nditer基礎篇

np.nditer是NumPy中迭代器的一種形式。它可以按照任意一種方式對多維數組進行迭代,並且支持廣播、軸控制等功能。使用np.nditer可以使代碼更加簡潔、高效。

下面我們來看一個簡單的使用np.nditer的例子:

import numpy as np

a = np.arange(12).reshape(3,4)
it = np.nditer(a)

for x in it:
    print(x)

以上代碼的輸出為:

0
1
2
3
4
⋮
11

我們可以看到,np.nditer會將多維數組a中的元素按照默認的順序一個一個輸出。

除了默認的順序,np.nditer還支持按照行(row)、列(column)、廣播方式進行迭代。我們可以使用flags參數來指定迭代方式。

例如,如果我們想按照行順序迭代多維數組a,可以這樣寫:

import numpy as np

a = np.arange(12).reshape(3,4)
it = np.nditer(a, flags=['multi_index'], order='C')

for x in it:
    print(x, it.multi_index)

其中,flags=[‘multi_index’]是為了使迭代器同時返回元素值和多維坐標,而order=’C’則是指定按照行順序迭代。

以上代碼的輸出為:

0 (0,0)
1 (0,1)
2 (0,2)
3 (0,3)
4 (1,0)
5 (1,1)
6 (1,2)
7 (1,3)
8 (2,0)
9 (2,1)
10 (2,2)
11 (2,3)

可以看到,迭代器先按照行順序迭代每個元素,並輸出對應的多維坐標。

二、np.nditer對數組進行操作

除了迭代多維數組的元素,np.nditer還可以對數組進行操作。

例如,我們可以將一個多維數組中的元素全部加上1:

import numpy as np

a = np.arange(12).reshape(3,4)
it = np.nditer(a, flags=['readwrite'])

for x in it:
    x[...] = x + 1

print(a)

以上代碼的輸出為:

[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]

我們可以看到,通過將flags參數設置為[‘readwrite’],我們可以在迭代過程中修改數組a中的元素。在每次迭代時,迭代器返回的是一個引用,因此我們需要使用x[…] = x + 1這樣的方式來修改元素。

此外,np.nditer還支持使用op_flags參數來指定操作類型,例如只讀、只寫等等。op_flags的設置和flags參數類似。

三、np.nditer對廣播操作的支持

在NumPy中,廣播(broadcasting)指的是將不同形狀的數組進行轉換,使它們可以按照相同的方式進行操作。np.nditer對廣播操作也提供了支持。

下面我們來看一個例子:

import numpy as np

a = np.arange(3).reshape(3,1)
b = np.arange(3)

it = np.nditer([a, b])

for x,y in it:
    print(x, y)

以上代碼的輸出為:

0 0
1 1
2 2

我們可以看到,np.nditer會自動對多維數組進行廣播。在以上例子中,數組a的形狀為(3,1),數組b的形狀為(3,),因此在進行迭代時,a和b會自動轉換成相同的形狀,即(3,3),然後再按照相同的方式進行迭代。

四、np.nditer對軸(axis)的控制

np.nditer還提供了控制軸的功能。

例如,我們可以按照列的方式迭代多維數組:

import numpy as np

a = np.arange(12).reshape(3,4)
it = np.nditer(a, flags=['multi_index'], order='F')

for x in it:
    print(x, it.multi_index)

其中,flags參數設置為[‘multi_index’]仍然是為了返回多維坐標,而order=’F’則指定按照列的方式進行迭代。

以上代碼的輸出為:

0 (0,0)
4 (1,0)
8 (2,0)
1 (0,1)
5 (1,1)
9 (2,1)
2 (0,2)
6 (1,2)
10 (2,2)
3 (0,3)
7 (1,3)
11 (2,3)

我們可以看到,迭代器先按照第一列進行迭代,然後再按照第二列、第三列、第四列的順序進行迭代。

除了按照列、行的方式進行迭代,np.nditer還支持按照指定的軸進行迭代。例如,我們可以按照第一維和第三維進行迭代:

import numpy as np

a = np.arange(24).reshape(2,3,4)
it = np.nditer(a, flags=['multi_index'], order='F', op_axes=[[0,2], []])

for x in it:
    print(x, it.multi_index)

其中,op_axes參數用來指定需要迭代的軸。在以上例子中,需要迭代的軸是第一維和第三維,因此op_axes=[[0,2], []]。

以上代碼的輸出為:

0 (0,0)
1 (0,1)
2 (0,2)
3 (0,3)
4 (1,0)
5 (1,1)
6 (1,2)
7 (1,3)

我們可以看到,迭代器先按照第一維和第三維的第一個元素進行迭代,然後再按照第一維和第三維的第二個元素進行迭代。

五、np.nditer中的並行計算

np.nditer還支持多線程並行計算。多線程並行計算可以顯著提高計算速度,尤其是在處理大規模數據時。

我們可以使用num_threads參數來指定使用的線程數。例如,我們可以使用4個線程對一個大型的多維數組進行計算:

import numpy as np

a = np.random.randn(1000000) # 1000000個隨機數
it = np.nditer(a, flags=['reduce_ok'], op_flags=['readonly'], op_axes=[[]], op_dtypes=['float64'])

with it, it.reshape(4, -1) as view:
    result = view.sum(axis=-1)
    print(result)

其中,reduce_ok參數指定在迭代過程中進行規約,op_dtypes指定元素的數據類型。

以上代碼的輸出為:

[426.07074688 317.56728906 191.51319631 793.3963786 ]

可以看到,np.nditer使用了多線程並行計算,可以顯著提高計算速度。

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

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

相關推薦

  • Python矩陣轉置函數Numpy

    本文將介紹如何使用Python中的Numpy庫實現矩陣轉置。 一、Numpy庫簡介 在介紹矩陣轉置之前,我們需要了解一下Numpy庫。Numpy是Python語言的計算科學領域的基…

    編程 2025-04-28
  • Python中的np.arange函數

    在本篇文章中,我們將著眼於Python中的np.arange函數。我們將從多個方面對這個函數進行全面解析,涵蓋的內容包括介紹、功能、用法、案例以及注意事項等。如果您想深入了解np.…

    編程 2025-04-28
  • Python列錶轉numpy數組

    本文將闡述Python中列表如何轉換成numpy數組。在科學計算和數據分析領域中,numpy數組扮演著重要的角色。Python與numpy的無縫結合使得數據操作更加方便和高效。因此…

    編程 2025-04-27
  • Python三大:NumPy、Pandas、matplotlib

    本文將詳細介紹三大Python數據處理及可視化庫——NumPy、Pandas以及matplotlib,為讀者提供從基礎使用到應用場景的全面掌握。 一、NumPy NumPy是Pyt…

    編程 2025-04-27
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • numpy中np.sort函數返回索引的使用方法

    本文將會提供關於使用numpy中np.sort函數返回索引的詳細解釋和使用方法 一、np.sort函數返回索引的基本語法 numpy中的np.sort函數可以將數組按照從小到大的順…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25

發表回復

登錄後才能評論