NumPy 學習筆記(二)

2022-08-15 21:42:16 字數 4864 閱讀 3137

陣列索引:

1、ndarray物件的內容可以通過索引或切片來訪問和修改,與 python 中 list 的切片操作一樣;

由於陣列可能是多維的,所以必須為陣列的每個維度指定乙個切片,使用切片時返回的是乙個子陣列

2、整數索引:獲取相應下標的元素的值

3、布林陣列索引:布林索引通過布林運算來獲取符合指定條件的元素的陣列

4、花式索引:不同的索引之間可以相互搭配,同時也可以和切片一起使用

import

numpy as np

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

#切片,返回 arr[:2][1:] 的相應元素

arr_t = arr[:2, 1:] #

輸出 arr_t: [[2 3] [5, 6]]

print("

arr[:2, 1:]:

", arr_t)

#整數索引允許使用相應下標組成的多維陣列

#這裡輸出 arr[0][1], arr[1][-1], arr[-1][0]

arr_t = arr[[0, 1, -1], [1, -1, 0]]

print("

arr_t:

", arr_t) #

輸出 arr_t: [2 6 7]

#布林索引使用布林運算選出符合條件的元素

arr_t = arr[arr > 5]

print("

arr > 5:

", arr_t)

arr_t = arr[arr % 2 == 1] #

[6 7 8 9]

print("

arr % 2 == 1:

", arr_t) #

[1 3 5 7 9]

#組合索引

#arr[row, col] row指定行,col 指定列,其切片方法與 python 操作一樣

arr_t = arr[::2, ::2]

print("

arr[::2, ::2]:

", arr_t) #

輸出 [[1 3] [7 9]]

#對元素值大於 5 的元素組成的子陣列進行切片

arr_t = arr[arr > 5][::2]

print("

arr[arr > 5][::2]:

", arr_t) #

輸出 [6 8]

#對行進行切片,同時獲取列為 0 的元素,這裡為 arr[1][0], arr[2][0]

arr_t = arr[1:, 0]

print("

arr[1:, 0]:

", arr_t) #

輸出 [4 7]

arr_t = arr[-1, :]

print("

arr[-1, :]:

", arr_t) #

同理,輸出 [7 8 9]

numpy 廣播:

1、廣播是 numpy 對不同形狀(shape)的陣列進行數值計算的方式

2、如果兩個陣列 a 和 b 形狀相同,即滿足a.shape == b.shape,那麼 a 與 b 的算術運算在對應位進行

3、廣播規則:

①讓所有輸入陣列都向其中形狀最長的陣列看齊,形狀中不足的部分都通過在前面加 1 補齊

②輸出陣列的形狀是輸入陣列形狀的各個維度上的最大值

③如果輸入陣列的某個維度和輸出陣列的對應維度的長度相同或者其長度為 1 時,這個陣列能夠用來計算,否則出錯

④當輸入陣列的某個維度的長度為 1 時,沿著此維度運算時都用此維度上的第一組值

import

numpy as np

one = np.arange(1, 26)

#修改陣列形狀為 5*5

one.shape = (5, 5)

print("

one:

", one)

#生成 [50...25) 的陣列

two = np.arange(50, 25, -1)

two.shape = (5, 5)

print("

two:

", two)

print("

one + two:

", one +two)

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

arr_two = np.array([1, 2, 3, 4])

#輸出 [[2 3 6 8] [6 8 10 12]]

print("

arr_one + arr_two:

", arr_one +arr_two)

arr_two = np.array([[1], [2]])

#輸出 [[2 3 4 5] [7 8 9 10]]

print("

arr_one + arr_two:

", arr_one +arr_two)

arr_two = np.array([2])

#輸出 [[2 4 6 8] [10 12 14 16]]

print("

arr_one * arr_two:

", arr_one * arr_two)

迭代陣列:

1、numpy 1.6 中引入的迭代器物件nditer提供了許多靈活的方式來以系統的方式訪問乙個或多個陣列的所有元素

2、nditer 使用標準 python 迭代器介面逐個提供每個元素

3、nditer物件提供了乙個 order 引數來控制迭代的順序,預設 order="k",即保持原有順序

4、預設情況下,nditer 將輸入陣列視為唯讀物件。 要修改陣列元素,必須指定讀寫或只寫模式

5、外部迴圈:若不使用外部迴圈,則陣列的每個元素由迭代器一次提供乙個;我們可以將一維最內層迴圈移動到迭代器外部的**中,

通過強制'c'和'f'順序,而得到不同的外部迴圈大小。 需要我們通過指定迭代器標誌來啟用此模式

import

numpy as np

#產生 [0, 2pi] 的等差陣列,其元素個數為 9

arr = np.linspace(0, 2 * np.pi, 9)

arr.shape = (3, 3)

print("

order is c

") #

按行for o in

np.nditer(arr):

print

(o)print("

order is f

") #

按列for o in np.nditer(arr.copy(order="f"

)):

print

(o)#

預設情況下,nditer將輸入陣列視為唯讀物件。 要修改陣列元素,必須指定讀寫或只寫模式

arr = np.arange(6).reshape(2, 3)

for o in

np.nditer(arr):

o = o*2

print("

arr:

", arr) #

沒有改變

for o in np.nditer(arr, op_flags=["

readwrite

"]):

#注意需要使用省略號索引

o[...] = o*2

print("

arr:

", arr)

#外部迴圈

arr = np.linspace(1, 6, 6).reshape(2, 3)

#輸出 [1. 2. 3. 4. 5. 6.] 注意和之前的區別

for o in np.nditer(arr, flags=["

external_loop

"]):

print("

arr:

", o)

time =0

#通過強制'c'和'f'順序,我們得到不同的外部迴圈大小

for o in np.nditer(arr, flags=["

external_loop

"], order="f"

):

print("

arr", time, ": "

, o)

time += 1

#跟蹤索引

#跟蹤索引或多索引與使用外部迴圈不相容,因為它需要每個元素具有不同的索引值

it = np.nditer(arr, flags=["

multi_index"])

lst =

while

notit.finished:

print("

value: {}\nmulti_index: <{}>

".format(it[0], it.multi_index))

it.iternext()

print("

all it.multi_index[1] - it.multi_index[0]:

", lst)

注:python中的常規賦值只是更改本地或全域性變數字典中的引用,而不是修改現有變數。 這意味著簡單地分配給 x 不會將值放入陣列的元素中,

而是將 x 作為陣列元素引用切換為對指定值的引用。 要實際修改陣列的元素,x應該用省略號索引

Numpy學習筆記 二

numpy通用函式 基本操作 陣列形狀 t reshape resize import numpy as np ar1 np.arange 10 ar2 np.ones 5 2 print ar1,n ar1.t print ar2,n ar2.t print t方法 轉置,例如原shape為 3,...

OPENCV學習筆記二 numpy用法

numpy numerical python 是 python 語言的乙個擴充套件程式庫,支援大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫。而本質上是乙個個畫素點疊加,一整張就像乙個陣列一樣,所以numpy的使用對於opencv的學習來說必不可少 本文資料主要來自於菜鳥教程 這張...

Numpy學習筆記

測試檔案裡的資料排列型別最好是有規律的,不可以隨便,否則將發生一些錯誤 genfromtxt函式 genfromtxt函式建立陣列 資料 genfromtxt主要執行兩個迴圈運算。第乙個迴圈將檔案的每一行轉換成字串序列。第二個迴圈將每個字串序列轉換為相應的資料型別。genfromtxt能夠考慮缺失的...