標籤:

Python-Numpy模塊Meshgrid函數

Numpy中關於Meshgrid函數:meshgrid官方。

1.Meshgrid前言

meshgrid函數就是用兩個坐標軸上的點在平面上畫網格(當然這裡傳入的參數是兩個的時候)。當然我們可以指定多個參數,比如三個參數,那麼我們的就可以用三個一維的坐標軸上的點在三維平面上畫網格。

2.Meshgrid的參數

numpy.meshgrid* xi** kwargs

  1. X_{1},X_{2}...X_{n} 。array_like代表網格坐標的一維數組,這裡可以傳入多個一維數組的值。但是這裡需要注意的就是如果我們給傳入的是一個矩陣(多維數組)的話,他會自動把這個矩陣轉換成一維數組;
  2. 索引(indexing):(xy[笛卡爾],ij[矩陣]),可選。默認是xy,下面會詳細解釋一下;
  3. 稀疏(sparse):bool,可選。默認為False。如果為True為了節省內存會返回一個稀疏矩陣;
  4. 複製(copy):bool,可選。默認為True。如果為False則為了節省內存返回源始的視圖。

返回值:

  1. X_{1},X_{2}...X_{N} :ndarray。對於二維數組來說,我們的參數是 x,y 兩個一維數組,我們設 x 形狀為N, y 的形狀為M。那麼他的返回值是一個list列表,裡面存放著兩個矩陣,我們可以通過解包操作來獲取 xvyv 兩個矩陣,這裡的返回值 xvLeftrightarrow X_{1}yv Leftrightarrow X_{2} 。我們指定了indexing參數,如果indexing = xy(默認)我們返回的 xvyv 矩陣的形狀是(M,N);如果indexing = ij的話我們返回的 xvyv 矩陣的形狀就是(N,M)。

3.indexing參數

上面介紹了indexing參數有兩個值xy和ij,默認值為xy。那他們兩個之間有什麼區別呢?其中xy代表的是笛卡爾,ij代表的是矩陣。我們直接通過結果來看。

import numpy as npx = np.array([1,2,3])y = np.array([4,5,6,7])xv,yv = np.meshgrid(x,y,indexing = xy)xv2,yv2 = np.meshgrid(x,y,indexing = ij)print(-----向量的形狀-----)print(x.shape)print(y.shape)print(-----xy-----)print(xv.shape)print(yv.shape)print(-----ij-----)print(xv2.shape)print(yv2.shape)-----向量的形狀-----(3,)(4,)-----xy-----(4, 3)(4, 3)-----ij-----(3, 4)(3, 4)

從上面我們可以看出,對於二維數組來說,對於兩個長度為3和4的一維數組,我們設N = 3 ,M = 4。對於我們indexing = xy(默認)來說,得到xv以及yv矩陣的形狀是(M,N)也就是(4,3);那對於indexing = ij我們的xv以及yv矩陣的形狀是(N,M)也就是(3,4)。

那對於三維來說,參數是三個一維數組,並且一維數組的形狀分別是N,M,P,那麼如果indexing = xy的話返回的三個矩陣xv,yv,zv的形狀都是(M,N,P);如果indexing = ij的話返回的是三個矩陣xv,yv,zv的形狀都是(N,M,P)

import numpy as npx = np.array([1,2,3])y = np.array([4,5,6,7])xv, yv = np.meshgrid(x, y, sparse=False, indexing=ij)for i in zip(xv.flat,yv.flat): print(i)print(----------)xv, yv = np.meshgrid(x, y, sparse=False, indexing=xy)for i in zip(xv.flat,yv.flat): print(i)

運行結果

4.如何使用

  1. xv,yv = meshgrid(x,y)
  2. xv,yv = meshgrid(x)與xv,yv = meshgrid(x,x)是等同的
  3. xv,yv,zv = meshgrid(x,y,z)生成三維數組,可用來計算三變數的函數和繪製三維立體圖

上面的這些都是直接進行解包後的返回值。其實他返回的是一個list列表,列表中存放的xv,yv,zv的這些numpy數組。

import numpy as npx = np.array([1,2,3]) #X_{x} = 3y = np.array([4,5,6,7]) #X_{y} = 4xv,yv = np.meshgrid( x , y )print(xv)print(yv)[[1 2 3] [1 2 3] [1 2 3] [1 2 3]][[4 4 4] [5 5 5] [6 6 6] [7 7 7]]

我們通過對兩個參數來一步一步的分析來看,看得到的結果是如何變成一個網格的:

x:表示我們的一維向量(1,2,3),他的N = 3

y:表示我們的一維向量(4,5,6,7),他的N = 4

xv:表示x坐標軸上的坐標矩陣

yv:表示y坐標軸上的坐標矩陣

x = np.array([1,2,3]) #x = (x1,x2,x3)y = np.array([4,5,6,7]) #y = (y1,y2,y3,y4)

xv,yv = np.meshgrid( x , y )

xv矩陣

我們把我們的一維向量 x 看成了 (x_{1},x_{2},x_{3}) ,我們也可以看上面我輸出的xv[[1 2 3]

[1 2 3] [1 2 3] [1 2 3]],如果看成是 (x_{1},x_{2},x_{3}) ,也就是4個向量,如圖所示。

yv矩陣

我們把我們的y向量看成了 (y_{1},y_{2},y_{3},y_{4}) ,然後我們從上面的列印出來的結果[[4 4 4] [5 5 5][6 6 6] [7 7 7]],我們的向量被豎著放起,然後推廣成三列。正如我們的yv矩陣所示。

我們的兩個一維數組形成的網格,我們就可以通過上面的分析得到:

網格化數據

左邊與其對應值

推薦閱讀:

跟黃哥學習python第二章
更改Django用戶密碼[備忘]
第八章 對象引用、可變性
Python基礎語法知識總結與實踐(二)

TAG:Python | numpy |