㈠ python數組的使用
1、Python的數組分三種類型:
(1) list 普通的鏈表,初始化後可以通過特定方法動態增加元素。定義方式:arr = [元素]
(2) Tuple 固定的數組,一旦定義後,其元素個數是不能再改變的。定義方式:arr = (元素)
(3) Dictionary 詞典類型, 即是Hash數組。定義方式:arr = {元素k:v}
2、下面具體說明這些數組的使用方法和技巧:
(1) list 鏈表數組
a、定義時初始化
a = [1,2,[1,2,3]]
b、定義時不初始化一維數組:
arr = []
多維數組: arr = [i for i in range(10), 1,[]] #注意, i for in xx 這個必須放在第一個位置,否則要先定義i,
如:
arr = [i for i in range(5), j for j in range(5), []]
這是錯誤的
這是正確的
c、del 語句和 : 的用法
可以用 start : end 表示數組里的一個區間 ( i >= start and i < end)
del 刪除數組里的指定元素
如:
d、遍歷數組:
e、增加元素:
一維 arr.append('aaa')
二維 arr[0].append('aaa')
如果要在任意位置插入用 arr.insert(n, 值)
此外還有一種特殊的用法是:
arr += [數組元素]
在不指定下標的情況下,是允許用 += 增加數組元素的。
(2) Tuple 固定數組Tuple 是不可變 list,一旦創建了一個 tuple 就不能以任何方式改變它。
下面拿具體示例說明:
Tuple 沒有的方法:
[1] 不能向 tuple 增加元素,沒有 append 、 extend 、insert 等方法。
[2] 不能從 tuple 刪除元素,沒有 remove 或 pop 方法。
[3] 不能在 tuple 中查找元素,沒有 index 方法(index是查找而不是索引,索引直接用下標即可,如:t[0])。
使用 tuple 的好處:
Tuple 可以轉換成 list, 反之亦然。
轉換方式為:
反之:
(2) Dictionary (哈希數組)詞典數組
*Dictionary 的用法比較簡單,它可以存儲任意值,並允許是不同類型的值,下面實例來說明:
*下面例子中 a 是整數, b 是字元串, c 是數組,這個例子充分說明哈希數組的適用性。
*可以直接增加一個元素,如果同名,則會改變原來的key的元素的值
*輸出所有的key
*輸出所有的value
*遍歷數組
㈡ Python——ndarray多維數組基本操作(1)
數組允許進行批量操作而無需使用for循環,因此更加簡便,這種特性也被稱為向量化。任何兩個等尺寸之間的算術操作都應用逐元素操作的方式進行。
同尺度數組之間的比較,會產生一個布爾型數組。
上述操作均是在同尺度數組之間進行的,對於不同尺度數組間的操作,會使用到廣播特性。
索引:獲取數組中特定位置元素的過程;
切片:獲取數組元素子集的過程。
new_a = a.astype(new_type)
astype()方法一定會創建新的數組(原始數據的一個拷貝),即使兩個類型一致。
ls = a.tolist()
轉置是一種特殊的數據重組形式,可以返回底層數據的視圖而不需要復制任何內容。
數組擁有 transpose 方法,也有特殊的 T 屬性。
對於更高緯度的數組, transpose 方法可以接受包含軸編號的元組,用於轉置軸。
ndarray的 swapaxes 方法,通過接受一對軸編號作為參數,並對軸進行調整用於重組數據。
swapaxes 方法返回的是數據的視圖,而沒有對數據進行復制。
Reference:
《Python for Data Analysis:Data Wrangling with Pandas,Numpy,and IPython》
㈢ Python—Numpy庫的用法
NumPy 是一個 Python 包。 它代表 「Numeric Python」。 它是一個由多維數組對象和用於處理數組的常式集合組成的庫。
NumPy 支持比 Python 更多種類的數值類型。 下表顯示了 NumPy 中定義的不同標量數據類型。
[('age', 'i1')]
[10 20 30]
[('abc', 21, 50.0), ('xyz', 18, 75.0)]
每個內建類型都有一個唯一定義它的字元代碼:
[[1, 2] [3, 4] [5, 6]]
[[[ 0, 1, 2] [ 3, 4, 5] [ 6, 7, 8] [ 9, 10, 11]] [[12, 13, 14] [15, 16, 17] [18, 19, 20] [21, 22, 23]]]
[1 2 3]
[1 2 3]
[(1, 2, 3) (4, 5)]
原始數組是: [[ 0 5 10 15] [20 25 30 35] [40 45 50 55]]
修改後的數組是: 0 5 10 15 20 25 30 35 40 45 50 55
原始數組是: [[ 0 5 10 15] [20 25 30 35] [40 45 50 55]]
原始數組的轉置是: [[ 0 20 40] [ 5 25 45] [10 30 50] [15 35 55]]
修改後的數組是: 0 5 10 15 20 25 30 35 40 45 50 55
C風格是橫著順序
F風格是豎著的順序
原始數組是: [[ 0 5 10 15] [20 25 30 35] [40 45 50 55]]
修改後的數組是: [[ 0 10 20 30] [ 40 50 60 70] [ 80 90 100 110]]
第一個數組: [[ 0 5 10 15] [20 25 30 35] [40 45 50 55]]
第二個數組: [1 2 3 4]
修改後的數組是: 0:1 5:2 10:3 15:4 20:1 25:2 30:3 35:4 40:1 45:2 50:3 55:4
原始數組: [[0 1 2 3] [4 5 6 7]]
調用 flat 函數之後: 5
原數組: [[0 1 2 3] [4 5 6 7]]
展開的數組:默認是A [0 1 2 3 4 5 6 7]
以 F 風格順序展開的數組: [0 4 1 5 2 6 3 7]
原數組: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]
轉置數組: [[ 0 4 8] [ 1 5 9] [ 2 6 10] [ 3 7 11]]
㈣ Python怎麼初始化一個多維數組
你可以定義一個嵌套的list 表示一個二維數組,並初始化為這樣: 1 2 score = [[0]*3, [0]*3,[0]*3] print score 這樣在循環外就能方便的訪問每個元素了。
㈤ Python怎麼生成三維數
importnumpyasnp
a=np.array([1,2,3],dtype=int)#創建1*3維數組array([1,2,3])
type(a)#numpy.ndarray類型
a.shape#維數信息(3L,)
a.dtype.name#'int32'
a.size#元素個數:3
a.itemsize#每個元素所佔用的位元組數目:4
b=np.array([[1,2,3],[4,5,6]],dtype=int)#創建2*3維數組array([[1,2,3],[4,5,6]])
b.shape#維數信息(2L,3L)
b.size#元素個數:6
b.itemsize#每個元素所佔用的位元組數目:4
c=np.array([[1,2,3],[4,5,6]],dtype='int16')#創建2*3維數組array([[1,2,3],[4,5,6]],dtype=int16)
c.shape#維數信息(2L,3L)
c.size#元素個數:6
c.itemsize#每個元素所佔用的位元組數目:2
c.ndim#維數
d=np.array([[1,2,3],[4,5,6]],dtype=complex)#復數二維數組
d.itemsize#每個元素所佔用的位元組數目:16
d.dtype.name#元素類型:'complex128'
importnumpyasnp
a=np.array([1,2,3],dtype=int)#創建1*3維數組array([1,2,3])
type(a)#numpy.ndarray類型
a.shape#維數信息(3L,)
a.dtype.name#'int32'
a.size#元素個數:3
a.itemsize#每個元素所佔用的位元組數目:4
b=np.array([[1,2,3],[4,5,6]],dtype=int)#創建2*3維數組array([[1,2,3],[4,5,6]])
b.shape#維數信息(2L,3L)
b.size#元素個數:6
b.itemsize#每個元素所佔用的位元組數目:4
c=np.array([[1,2,3],[4,5,6]],dtype='int16')#創建2*3維數組array([[1,2,3],[4,5,6]],dtype=int16)
c.shape#維數信息(2L,3L)
c.size#元素個數:6
c.itemsize#每個元素所佔用的位元組數目:2
c.ndim#維數
d=np.array([[1,2,3],[4,5,6]],dtype=complex)#復數二維數組
d.itemsize#每個元素所佔用的位元組數目:16
d.dtype.name#元素類型:'complex128'
a1=np.zeros((3,4))#創建3*4全零二維數組
輸出:
array([[0.,0.,0.,0.],
[0.,0.,0.,0.],
[0.,0.,0.,0.]])
a1.dtype.name#元素類型:'float64'
a1.size#元素個數:12
a1.itemsize#每個元素所佔用的位元組個數:8
a2=np.ones((2,3,4),dtype=np.int16)#創建2*3*4全1三維數組
a2=np.ones((2,3,4),dtype='int16')#創建2*3*4全1三維數組
輸出:
array([[[1,1,1,1],
[1,1,1,1],
[1,1,1,1]],
[[1,1,1,1],
[1,1,1,1],
[1,1,1,1]]],dtype=int16)
a3=np.empty((2,3))#創建2*3的未初始化二維數組
輸出:(mayvary)
array([[1.,2.,3.],
[4.,5.,6.]])
a4=np.arange(10,30,5)#初始值10,結束值:30(不包含),步長:5
輸出:array([10,15,20,25])
a5=np.arange(0,2,0.3)#初始值0,結束值:2(不包含),步長:0.2
輸出:array([0.,0.3,0.6,0.9,1.2,1.5,1.8])
fromnumpyimportpi
np.linspace(0,2,9)#初始值0,結束值:2(包含),元素個數:9
輸出:
array([0.,0.25,0.5,0.75,1.,1.25,1.5,1.75,2.])
x=np.linspace(0,2*pi,9)
輸出:
array([0.,0.78539816,1.57079633,2.35619449,3.14159265,
3.92699082,4.71238898,5.49778714,6.28318531])
a=np.arange(6)
輸出:
array([0,1,2,3,4,5])
b=np.arange(12).reshape(4,3)
輸出:
array([[0,1,2],
[3,4,5],
[6,7,8],
[9,10,11]])
c=np.arange(24).reshape(2,3,4)
輸出:
array([[[0,1,2,3],
[4,5,6,7],
[8,9,10,11]],
[[12,13,14,15],
[16,17,18,19],
[20,21,22,23]]])
使用numpy.set_printoptions可以設置numpy變數的列印格式
在ipython環境下,使用help(numpy.set_printoptions)查詢使用幫助和示例
加法和減法操作要求操作雙方的維數信息一致,均為M*N為數組方可正確執行操作。
a=np.arange(4)
輸出:
array([0,1,2,3])
b=a**2
輸出:
array([0,1,4,9])
c=10*np.sin(a)
輸出:
array([0.,8.41470985,9.09297427,1.41120008])
n<35
輸出:
array([True,True,True,True],dtype=bool)
A=np.array([[1,1],[0,1]])
B=np.array([[2,0],[3,4]])
C=A*B#元素點乘
輸出:
array([[2,0],
[0,4]])
D=A.dot(B)#矩陣乘法
輸出:
array([[5,4],
[3,4]])
E=np.dot(A,B)#矩陣乘法
輸出:
array([[5,4],
[3,4]])
多維數組操作過程中的類型轉換
When operating with arrays of different types, the type of the
resulting array corresponds to the more general or precise one (a
behavior known as upcasting)
即操作不同類型的多維數組時,結果自動轉換為精度更高類型的數組,即upcasting
數組索引、切片和迭代
a=np.ones((2,3),dtype=int)#int32
b=np.random.random((2,3))#float64
b+=a#正確
a+=b#錯誤
a=np.ones(3,dtype=np.int32)
b=np.linspace(0,pi,3)
c=a+b
d=np.exp(c*1j)
輸出:
array([0.54030231+0.84147098j,-0.84147098+0.54030231j,
-0.54030231-0.84147098j])
d.dtype.name
輸出:
'complex128'
多維數組的一元操作,如求和、求最小值、最大值等
a=np.random.random((2,3))
a.sum()
a.min()
a.max()
b=np.arange(12).reshape(3,4)
輸出:
array([[0,1,2,3],
[4,5,6,7],
[8,9,10,11]])
b.sum(axis=0)#按列求和
輸出:
array([12,15,18,21])
b.sum(axis=1)#按行求和
輸出:
array([6,22,38])
b.cumsum(axis=0)#按列進行元素累加
輸出:
array([[0,1,2,3],
[4,6,8,10],
[12,15,18,21]])
b.cumsum(axis=1)#按行進行元素累加
輸出:
array([[0,1,3,6],
[4,9,15,22],
[8,17,27,38]])
universal functions
B=np.arange(3)
np.exp(B)
np.sqrt(B)
C=np.array([2.,-1.,4.])
np.add(B,C)
其他的ufunc函數包括:
all,any,apply_along_axis,argmax,argmin,argsort,average,bincount,ceil,clip,conj,corrcoef,cov,cross,cumprod,cumsum,diff,dot,floor,inner,lexsort,max,maximum,mean,median,min,minimum,nonzero,outer,prod,re,round,sort,std,sum,trace,transpose,var,vdot,vectorize,where
a=np.arange(10)**3
a[2]
a[2:5]
a[::-1]#逆序輸出
foriina:
print(i**(1/3.))
deff(x,y):
return10*x+y
b=np.fromfunction(f,(5,4),dtype=int)
b[2,3]
b[0:5,1]
b[:,1]
b[1:3,:]
b[-1]
c=np.array([[[0,1,2],[10,11,12]],[[100,101,102],[110,111,112]]])
輸出:
array([[[0,1,2],
[10,11,12]],
[[100,101,102],
[110,111,112]]])
c.shape
輸出:
(2L,2L,3L)
c[0,...]
c[0,:,:]
輸出:
array([[0,1,2],
[10,11,12]])
c[:,:,2]
c[...,2]
輸出:
array([[2,12],
[102,112]])
forrowinc:
print(row)
forelementinc.flat:
print(element)
a=np.floor(10*np.random.random((3,4)))
輸出:
array([[3.,9.,8.,4.],
[2.,1.,4.,6.],
[0.,6.,0.,2.]])
a.ravel()
輸出:
array([3.,9.,8.,...,6.,0.,2.])
a.reshape(6,2)
輸出:
array([[3.,9.],
[8.,4.],
[2.,1.],
[4.,6.],
[0.,6.],
[0.,2.]])
a.T
輸出:
array([[3.,2.,0.],
[9.,1.,6.],
[8.,4.,0.],
[4.,6.,2.]])
a.T.shape
輸出:
(4L,3L)
a.resize((2,6))
輸出:
array([[3.,9.,8.,4.,2.,1.],
[4.,6.,0.,6.,0.,2.]])
a.shape
輸出:
(2L,6L)
a.reshape(3,-1)
輸出:
array([[3.,9.,8.,4.],
[2.,1.,4.,6.],
[0.,6.,0.,2.]])
詳查以下函數:
ndarray.shape,reshape,resize,ravel
a=np.floor(10*np.random.random((2,2)))
輸出:
array([[5.,2.],
[6.,2.]])
b=np.floor(10*np.random.random((2,2)))
輸出:
array([[0.,2.],
[4.,1.]])
np.vstack((a,b))
輸出:
array([[5.,2.],
[6.,2.],
[0.,2.],
[4.,1.]])
np.hstack((a,b))
輸出:
array([[5.,2.,0.,2.],
[6.,2.,4.,1.]])
fromnumpyimportnewaxis
np.column_stack((a,b))
輸出:
array([[5.,2.,0.,2.],
[6.,2.,4.,1.]])
a=np.array([4.,2.])
b=np.array([2.,8.])
a[:,newaxis]
輸出:
array([[4.],
[2.]])
b[:,newaxis]
輸出:
array([[2.],
[8.]])
np.column_stack((a[:,newaxis],b[:,newaxis]))
輸出:
array([[4.,2.],
[2.,8.]])
np.vstack((a[:,newaxis],b[:,newaxis]))
輸出:
array([[4.],
[2.],
[2.],
[8.]])
np.r_[1:4,0,4]
輸出:
array([1,2,3,0,4])
np.c_[np.array([[1,2,3]]),0,0,0,np.array([[4,5,6]])]
輸出:
array([[1,2,3,0,0,0,4,5,6]])
詳細使用請查詢以下函數:
hstack,vstack,column_stack,concatenate,c_,r_
a=np.floor(10*np.random.random((2,12)))
輸出:
array([[9.,7.,9.,...,3.,2.,4.],
[5.,3.,3.,...,9.,7.,7.]])
np.hsplit(a,3)
輸出:
[array([[9.,7.,9.,6.],
[5.,3.,3.,1.]]),array([[7.,2.,1.,6.],
[7.,5.,0.,2.]]),array([[9.,3.,2.,4.],
[3.,9.,7.,7.]])]
np.hsplit(a,(3,4))
輸出:
[array([[9.,7.,9.],
[5.,3.,3.]]),array([[6.],
[1.]]),array([[7.,2.,1.,...,3.,2.,4.],
[7.,5.,0.,...,9.,7.,7.]])]
實現類似功能的函數包括:
hsplit,vsplit,array_split
a=np.arange(12)
輸出:
array([0,1,2,...,9,10,11])
notatall
b=a
bisa#True
b.shape=3,4
a.shape#(3L,4L)
deff(x)#,sofunctioncallsmakeno.
print(id(x))#id是python對象的唯一標識符
id(a)#111833936L
id(b)#111833936L
f(a)#111833936L
淺復制
c=a.view()
cisa#False
c.baseisa#True
c.flags.owndata#False
c.shape=2,6
a.shape#(3L,4L)
c[0,4]=1234
print(a)
輸出:
array([[0,1,2,3],
[1234,5,6,7],
[8,9,10,11]])
s=a[:,1:3]
s[:]=10
print(a)
輸出:
array([[0,10,10,3],
[1234,10,10,7],
[8,10,10,11]])
深復制
d=a.()
disa#False
d.baseisa#False
d[0,0]=9999
print(a)
輸出:
array([[0,10,10,3],
[1234,10,10,7],
[8,10,10,11]])
numpy基本函數和方法一覽
Array Creation
arange,array,,empty,empty_like,eye,fromfile,fromfunction,identity,linspace,logspace,mgrid,ogrid,ones,ones_like,r,zeros,zeros_like
Conversions
ndarray.astype,atleast_1d,atleast_2d,atleast_3d,mat
Manipulations
array_split,column_stack,concatenate,diagonal,dsplit,dstack,hsplit,hstack,ndarray.item,newaxis,ravel,repeat,reshape,resize,squeeze,swapaxes,take,transpose,vsplit,vstack
Questionsall,any,nonzero,where
Ordering
argmax,argmin,argsort,max,min,ptp,searchsorted,sort
Operations
choose,compress,cumprod,cumsum,inner,ndarray.fill,imag,prod,put,putmask,real,sum
Basic Statistics
cov,mean,std,var
Basic Linear Algebra
cross,dot,outer,linalg.svd,vdot
完整的函數和方法一覽表鏈接:
https://docs.scipy.org/doc/numpy-dev/reference/routines.html#routines
㈥ python 中怎麼用numpy定義reshape的float數組
Numpy的主要數據類型是ndarray,即多維數組。它有以下幾個屬性:ndarray.ndim:數組的維數
ndarray.shape:數組每一維的大小
ndarray.size:數組中全部元素的數量
ndarray.dtype:數組中元素的類型凳喊稿(numpy.int32, numpy.int16, and numpy.float64等滲纖)
ndarray.itemsize:每個元素占幾個位元組!棗孝
㈦ [Xarray] 1. 數據結構
參考 Xarray官方文檔 , Python氣象數據處理進階之Xarray(1):Xarray的數據結構
在Xarray中,數據是由結構和標簽的,分為以下幾種:
1.DataArray:
帶沖正有標注或命名維度的多維數組。DataArray將metadata(例如:維名稱,坐標和屬性)添加到基礎的 未標記 的數據結構,例如numpy和Dask數組。
2.Datasets:
具有類似字典結構的尺寸對其的DataArray對象的 集合 。因此,可以在單個DataArray的維度上執行的大多數操作都可以在Dataset上執行。
Dataset是多個DataArray的集合
3.Variable:
類似於NetCDF的變數。由dimensions,data和attributes組成。variable和numpy數組之間的主要功能鬧毀區別在於,對variable的數字運算可以通過 維名稱 實現數組廣播。
通俗的講,variables < DataArray < Dataset (<指包含於)。這種解釋不完全正確,但是初學者可以這樣理解。
Xarray通過對維命名的操作實現數據篩選和處理,實現數據的標記和命名通過以下幾個定液判備義實現:
* Dimension : 每一軸的維名稱(e.g.,('x','y','z'))。
* Coordinate : 坐標或刻度。類似於字典的序列,將每個點標記。比如說dimension是緯度,那麼對應的coordinate就是緯度坐標(90°N,89°N,88°N……89°S,90°S)。
* Index : 索引號,也可以說是位置標號。a[0]代表a數組的一個數,0就是index。
可以看到,該文件是一個Datasets,裡面含有變數:Data Variables,數據集的維度有經度緯度和時間,各自有各自的坐標Coordinates,同樣數據集還有一些屬性來表明數據集信息。
我們可以通過:
來分別查看數據集中包含的變數,維,坐標。
再比如NCEP的位勢高度資料:
基本同上。
需要說明的是,ncl數據中存在short格式,在讀取時需要使用short2flt()函數,但是在Python中不存在short格式,默認均為float,無需考慮這一點。
有時我們通過其他手段讀取了相關數據,但是數據是np.array格式的,我們需要將其轉換為DataArray,亦或我們需要輸出一個NC文件,需要將計算後的數組轉為DataArray格式,這就用到了創建的方法。
1.Data: 數據,可以是numpy ndarray,series,DataFrame,pandas.panel等格式
2.coords: 坐標列表或字典
如果是列表,則應為元組列表。其中第一個元素為dimension name,第二個元素是對應的坐標array_like對象。
用字典格式比較好
3.dims: 維名稱列表
如果省略,並且coords是元組列表,則維度名稱取自coords。
4.attrs: 屬性
5.names: 變數名
以上,除了data外,都不是必須的。
創建示例如下:
上面提到,除了data以外,其他都是不必要的
如果是從一個DataFrame數據轉化為DataArray的話(這種操作通常是為了將Pandas和Xarray聯合使用):
會自動識別行列的名稱和序號。
官方文檔還有更復雜的例子,需要的話再去官網查看。
在創建了數據之後,我們同樣可以使用相關的操作獲取DataArray的各種信息:
如果想對DataArray的值修改可以通過以下兩種方法:
兩種結果是等價的,但官方只給出了第一種方法。
*通過指令 foo.rename('temperature') 改名,比如通過hgt計算得到了一個新變數,需要改名,就可以用這個指令。
在得到一個DataArray後,用於畫圖時,比如我們需要獲取它的經度和緯度(在這里,剛剛的例子是時間和高度),那麼可以直接通過
這兩種方式取出坐標信息。
要修改或者刪除某坐標信息的話,原理和修改數據是一樣的:
官網給出一個以氣候數據為例的Dataset結構:
<center>
</center>
一個數據集,包含了數據主體(Temperature,Precipitation),維度坐標(latitude,longitude)。
根據官網的例子,一個Dataset是這樣創建的,實際上與DataArray類似:
實際上這個例子與我們通常接觸的不太一樣,因為大部分數據的lat和lon都是一維的。
對Dataset的操作和DataArray基本一致,不再重復。
㈧ python 3 三維數組或者多維數組 怎麼計算元素的百分比,詳細裡面會具體一點
在Python中,一個像這樣的多維表格可以通過「序列的序列」實現。一個表格是行的序列。每一行又是獨立單元格的序列。這類似於我們使用的數學記號,在數學里我們用Ai,j,而在Python里我們使用A[i][j],代表矩陣的第i行第j列。
這看起來非常像「元組的列表」(Lists of Tuples)。
「列表的列表」示例
我們可以使用嵌套的列表推導式(list comprehension)創建一個表格。 下面的例子創建了一個「序列的序列」構成的表格,並為表格的每一個單元格賦值。
table= [ [ 0 for i in range(6) ] for j in range(6) ]
print table
for d1 in range(6):
for d2 in range(6):
table[d1][d2]= d1+d2+2
print table
123456
程序的輸出結果如下:
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
[[2, 3, 4, 5, 6, 7], [3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9],
[5, 6, 7, 8, 9, 10], [6, 7, 8, 9, 10, 11], [7, 8, 9, 10, 11, 12]]
1234
這個程序做了兩件事:創建了一個6 × 6的全0表格。 然後使用兩枚骰子的可能組合的數值填充表格。 這並非完成此功能最有效的方式,但我們通過這個簡單的例子來演示幾項技術。我們仔細看一下程序的前後兩部分。
程序的第一部分創建並輸出了一個包含6個元素的列表,我們稱之為「表格」;表格中的每一個元素都是一個包含6個0元素的列表。它使用列表推導式,對
於范圍從0到6的每一個j都創建對象。每一個對象都是一個0元素列表,由i變數從0到6遍歷產生。初始化完成之後,列印輸出二維全0表格。
推導式可以從里向外閱讀,就像一個普通表達式一樣。內層列表[ 0 for i in range(6) ]創建了一個包含6個0的簡單列表。外層列表[ [...] for j in range(6) ]創建了這些內層列表的6個深拷貝。
程序的第2個部分對2個骰子的每一個組合進行迭代,填充表格的每一個單元格。這由兩層嵌套循環實現,每一個循環迭代一個骰子。外層循環枚舉第一個骰子的所有可能值d1。內層循環枚舉第二個骰子d2。
更新每一個單元格時需要通過table[d1]選擇每一行;這是一個包含6個值的列表。這個列表中選定的單元格通過...[d2]進行選擇。我們將擲骰子的值賦給這個單元格,d1+d2+2
其他示例
列印出的列表的列表不太容易閱讀。下面的循環會以一種更加可讀的形式顯示表格。
>>>
for row in table:
...
print row
...
[2, 3, 4, 5, 6, 7]
[3, 4, 5, 6, 7, 8]
[4, 5, 6, 7, 8, 9]
[5, 6, 7, 8, 9, 10]
[6, 7, 8, 9, 10, 11]
[7, 8, 9, 10, 11, 12]
12345678910111213
作為練習,讀者可以試著在列印列表內容時,再列印出行和列的表頭。提示一下,使用"%2d" % value字元串運算符可以列印出固定長度的數字格式。
顯示索引值(Explicit Index Values)
我們接下來對骰子表格進行匯總統計,得出累計頻率表。我們使用一個包含13個元素的列表(下標從0到12)表示每一個骰子值的出現頻率。觀察可知骰子值2在矩陣中只出現了一次,因此我們期望fq[2]的值為1。遍歷矩陣中的每一個單元格,得出累計頻率表。
fq= 13 * [0]
for i in range(6):
for j in range(6):
c= table[i][j]
fq[ c ] += 1
12345
使用下標i選出表格中的行,用下標j從行中選出一列,得到單元格c。然後用fq統計頻率。
這看起來非常的數學和規范。Python提供了另外一種更簡單一些的方式。
使用列表迭代器而非下標
表格是列表的列表,可以採用無下標的for循環遍歷列表元素。
fq= 13 * [0]
print fq
for row in table:
for c in row:
fq[c] += 1
print fq[2:]
㈨ python中怎麼表示多維數組
只有通過遍歷得到。這個應該沒有直接獲取的方式方法。遍歷這個數組,當然維數不確定的話你就需要使用遞歸,然後一一判斷它的值是否為你指定的值,然後輸出索引。另外,建議不要匿名提問,因為這會讓很多高手不屑於回答你的問題。
㈩ python中如何表示多維數組
在Python中,一個像這樣的多維表格可以通過「序列的序列」實現。一個表格是行的序列。每一行又是獨立單元格的序列。這類似於我們使用的數學記號,在數學里我們用Ai,j,而在Python里我們使用A[i][j],代表矩陣的第i行第j列。
這看起來非常像「元組的列表」(Lists of Tuples)。
「列表的列表」示例:
我們可以使用嵌套的列表推導式(list comprehension)創建一個表格。 下面的例子創建了一個「序列的序列」構成的表格,並為表格的每一個單元格賦值。
table= [ [ 0 for i in range(6) ] for j in range(6) ]print tablefor d1 in range(6):for d2 in range(6):table[d1][d2]= d1+d2+2print table123456程序的輸出結果如下:
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]],
[[2, 3, 4, 5, 6, 7], [3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9],
[5, 6, 7, 8, 9, 10], [6, 7, 8, 9, 10, 11], [7, 8, 9, 10, 11, 12]]
1234
這個程序做了兩件事:創建了一個6 × 6的全0表格。 然後使用兩枚骰子的可能組合的數值填充表格。 這並非完成此功能最有效的方式,但我們通過這個簡單的例子來演示幾項技術。我們仔細看一下程序的前後兩部分。
程序的第一部分創建並輸出了一個包含6個元素的列表,我們稱之為「表格」;表格中的每一個元素都是一個包含6個0元素的列表。它使用列表推導式,對於范圍從0到6的每一個j都創建對象。每一個對象都是一個0元素列表,由i變數從0到6遍歷產生。初始化完成之後,列印輸出二維全0表格。
推導式可以從里向外閱讀,就像一個普通表達式一樣。內層列表[ 0 for i in range(6) ]創建了一個包含6個0的簡單列表。外層列表[ [...] for j in range(6) ]創建了這些內層列表的6個深拷貝。
程序的第2個部分對2個骰子的每一個組合進行迭代,填充表格的每一個單元格。這由兩層嵌套循環實現,每一個循環迭代一個骰子。外層循環枚舉第一個骰子的所有可能值d1。內層循環枚舉第二個骰子d2。
更新每一個單元格時需要通過table[d1]選擇每一行;這是一個包含6個值的列表。這個列表中選定的單元格通過...[d2]進行選擇。我們將擲骰子的值賦給這個單元格,d1+d2+2。
其他示例:
列印出的列表的列表不太容易閱讀。下面的循環會以一種更加可讀的形式顯示表格。
for row in table:
print row[2, 3, 4, 5, 6, 7]
[3, 4, 5, 6, 7, 8]
[4, 5, 6, 7, 8, 9]
[5, 6, 7, 8, 9, 10]
[6, 7, 8, 9, 10, 11]
[7, 8, 9, 10, 11, 12]
12345678910111213作為練習,讀者可以試著在列印列表內容時,再列印出行和列的表頭。提示一下,使用"%2d" % value字元串運算符可以列印出固定長度的數字格式。顯示索引值(Explicit Index Values)。
我們接下來對骰子表格進行匯總統計,得出累計頻率表。我們使用一個包含13個元素的列表(下標從0到12)表示每一個骰子值的出現頻率。觀察可知骰子值2在矩陣中只出現了一次,因此我們期望fq[2]的值為1。遍歷矩陣中的每一個單元格,得出累計頻率表。
fq= 13 * [0]for i in range(6):for j in range(6):c= table[i][j]fq[ c ] += 112345使用下標i選出表格中的行,用下標j從行中選出一列,得到單元格c。然後用fq統計頻率。
這看起來非常的數學和規范。
Python提供了另外一種更簡單一些的方式。
使用列表迭代器而非下標,表格是列表的列表,可以採用無下標的for循環遍歷列表元素。
fq= 13 * [0]print fqfor row in table:for c in row:fq[c] += 1print fq[2: