鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ NumPy在數(shù)組上的迭代
NumPy位操作
NumPy數(shù)學(xué)算數(shù)函數(shù)
NumPy高級索引
NumPy環(huán)境安裝配置
NumPy IO文件操作
NumPy字符串函數(shù)
NumPy切片和索引
NumPy統(tǒng)計(jì)函數(shù)
NumPy矩陣庫
NumPy數(shù)組創(chuàng)建例程
NumPy線性代數(shù)
NumPy Matplotlib庫
NumPy教程
NumPy排序、搜索和計(jì)數(shù)函數(shù)
NumPy字節(jié)交換
NumPy Ndarray對象
NumPy數(shù)組操作
NumPy使用 Matplotlib 繪制直方圖
NumPy數(shù)組屬性
NumPy廣播
NumPy來自現(xiàn)有數(shù)據(jù)的數(shù)組
NumPy副本和視圖
NumPy在數(shù)組上的迭代
NumPy來自數(shù)值范圍的數(shù)組
NumPy算數(shù)運(yùn)算
NumPy數(shù)據(jù)類型

NumPy在數(shù)組上的迭代

NumPy - 數(shù)組上的迭代

NumPy 包包含一個(gè)迭代器對象numpy.nditer。 它是一個(gè)有效的多維迭代器對象,可以用于在數(shù)組上進(jìn)行迭代。 數(shù)組的每個(gè)元素可使用 Python 的標(biāo)準(zhǔn)Iterator接口來訪問。

讓我們使用arange()函數(shù)創(chuàng)建一個(gè) 3X4 數(shù)組,并使用nditer對它進(jìn)行迭代。

示例 1

import numpy as np
a = np.arange(0,60,5) 
a = a.reshape(3,4)  
print  '原始數(shù)組是:'  
print a print  '\n'  
print  '修改后的數(shù)組是:'  
for x in np.nditer(a):  
    print x,

輸出如下:

原始數(shù)組是:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

修改后的數(shù)組是:
0 5 10 15 20 25 30 35 40 45 50 55

示例 2

迭代的順序匹配數(shù)組的內(nèi)容布局,而不考慮特定的排序。 這可以通過迭代上述數(shù)組的轉(zhuǎn)置來看到。

import numpy as np 
a = np.arange(0,60,5) 
a = a.reshape(3,4)  
print  '原始數(shù)組是:'  
print a 
print  '\n'  
print  '原始數(shù)組的轉(zhuǎn)置是:' 
b = a.T 
print b 
print  '\n'  
print  '修改后的數(shù)組是:'  
for x in np.nditer(b):  
    print x,

輸出如下:

原始數(shù)組是:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

原始數(shù)組的轉(zhuǎn)置是:
[[ 0 20 40]
 [ 5 25 45]
 [10 30 50]
 [15 35 55]]

修改后的數(shù)組是:
0 5 10 15 20 25 30 35 40 45 50 55

迭代順序

如果相同元素使用 F 風(fēng)格順序存儲,則迭代器選擇以更有效的方式對數(shù)組進(jìn)行迭代。

示例 1

import numpy as np
a = np.arange(0,60,5) 
a = a.reshape(3,4)  
print  '原始數(shù)組是:'  
print a print  '\n'  
print  '原始數(shù)組的轉(zhuǎn)置是:' 
b = a.T 
print b 
print  '\n'  
print  '以 C 風(fēng)格順序排序:' 
c = b.copy(order='C')  
print c for x in np.nditer(c):  
    print x,  
print  '\n'  
print  '以 F 風(fēng)格順序排序:' 
c = b.copy(order='F')  
print c 
for x in np.nditer(c):  
    print x,

輸出如下:

原始數(shù)組是:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

原始數(shù)組的轉(zhuǎn)置是:
[[ 0 20 40]
 [ 5 25 45]
 [10 30 50]
 [15 35 55]]

以 C 風(fēng)格順序排序:
[[ 0 20 40]
 [ 5 25 45]
 [10 30 50]
 [15 35 55]]
0 20 40 5 25 45 10 30 50 15 35 55

以 F 風(fēng)格順序排序:
[[ 0 20 40]
 [ 5 25 45]
 [10 30 50]
 [15 35 55]]
0 5 10 15 20 25 30 35 40 45 50 55

示例 2

可以通過顯式提醒,來強(qiáng)制nditer對象使用某種順序:

import numpy as np 
a = np.arange(0,60,5) 
a = a.reshape(3,4)  
print  '原始數(shù)組是:'  
print a 
print  '\n'  
print  '以 C 風(fēng)格順序排序:'  
for x in np.nditer(a, order =  'C'):  
    print x,  
print  '\n'  
print  '以 F 風(fēng)格順序排序:'  
for x in np.nditer(a, order =  'F'):  
    print x,

輸出如下:

原始數(shù)組是:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

以 C 風(fēng)格順序排序:
0 5 10 15 20 25 30 35 40 45 50 55

以 F 風(fēng)格順序排序:
0 20 40 5 25 45 10 30 50 15 35 55

修改數(shù)組的值

nditer對象有另一個(gè)可選參數(shù)op_flags。 其默認(rèn)值為只讀,但可以設(shè)置為讀寫或只寫模式。 這將允許使用此迭代器修改數(shù)組元素。

示例

import numpy as np
a = np.arange(0,60,5) 
a = a.reshape(3,4)  
print  '原始數(shù)組是:'  
print a 
print  '\n'  
for x in np.nditer(a, op_flags=['readwrite']): 
    x[...]=2*x 
print  '修改后的數(shù)組是:'  
print a

輸出如下:

原始數(shù)組是:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

修改后的數(shù)組是:
[[ 0 10 20 30]
 [ 40 50 60 70]
 [ 80 90 100 110]]

外部循環(huán)

nditer類的構(gòu)造器擁有flags參數(shù),它可以接受下列值:

序號 參數(shù)及描述
1. c_index 可以跟蹤 C 順序的索引
2. f_index 可以跟蹤 Fortran 順序的索引
3. multi-index 每次迭代可以跟蹤一種索引類型
4. external_loop 給出的值是具有多個(gè)值的一維數(shù)組,而不是零維數(shù)組

示例

在下面的示例中,迭代器遍歷對應(yīng)于每列的一維數(shù)組。

import numpy as np 
a = np.arange(0,60,5) 
a = a.reshape(3,4)  
print  '原始數(shù)組是:'  
print a 
print  '\n'  
print  '修改后的數(shù)組是:'  
for x in np.nditer(a, flags =  ['external_loop'], order =  'F'):  
    print x,

輸出如下:

原始數(shù)組是:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

修改后的數(shù)組是:
[ 0 20 40] [ 5 25 45] [10 30 50] [15 35 55]

廣播迭代

如果兩個(gè)數(shù)組是可廣播的,nditer組合對象能夠同時(shí)迭代它們。 假設(shè)數(shù)組a具有維度 3X4,并且存在維度為 1X4 的另一個(gè)數(shù)組b,則使用以下類型的迭代器(數(shù)組b被廣播到a的大小)。

示例

import numpy as np 
a = np.arange(0,60,5) 
a = a.reshape(3,4)  
print  '第一個(gè)數(shù)組:'  
print a 
print  '\n'  
print  '第二個(gè)數(shù)組:' 
b = np.array([1,  2,  3,  4], dtype =  int)  
print b 
print  '\n'  
print  '修改后的數(shù)組是:'  
for x,y in np.nditer([a,b]):  
    print  "%d:%d"  %  (x,y),

輸出如下:

第一個(gè)數(shù)組:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

第二個(gè)數(shù)組:
[1 2 3 4]

修改后的數(shù)組是:
0:1 5:2 10:3 15:4 20:1 25:2 30:3 35:4 40:1 45:2 50:3 55:4

上一篇:NumPy位操作下一篇:NumPy廣播