回答(23)
2 years ago
我正在使用我的第一個Python腳本,我對方陣示例感到有些困惑,是以我希望下面的示例可以幫助您節省一些時間:
# Creates a 2 x 5 matrix
Matrix = [[0 for y in xrange(5)] for x in xrange(2)]
以便
Matrix[1][4] = 2 # Valid
Matrix[4][1] = 3 # IndexError: list index out of range
2 years ago
# Creates a list containing 5 lists initialized to 0
Matrix = [[0]*5]*5
請注意這個簡短的表達,請參閱@ F.J的答案中的完整解釋
2 years ago
使用NumPy,您可以像這樣初始化空矩陣:
import numpy as np
mm = np.matrix([])
然後追加這樣的資料:
mm = np.append(mm, [[1,2]], axis=1)
2 years ago
這就是字典的制作!
matrix = {}
您可以通過兩種方式定義 keys 和 values :
matrix[0,0] = value
要麼
matrix = { (0,0) : value }
結果:
[ value, value, value, value, value],
[ value, value, value, value, value],
...
2 years ago
A rewrite for easy reading:
# 2D array/ matrix
# 5 rows, 5 cols
rows_count = 5
cols_count = 5
# create
# creation looks reverse
# create an array of "cols_count" cols, for each of the "rows_count" rows
# all elements are initialized to 0
two_d_array = [[0 for j in range(cols_count)] for i in range(rows_count)]
# index is from 0 to 4
# for both rows & cols
# since 5 rows, 5 cols
# use
two_d_array[0][0] = 1
print two_d_array[0][0] # prints 1 # 1st row, 1st col (top-left element of matrix)
two_d_array[1][0] = 2
print two_d_array[1][0] # prints 2 # 2nd row, 1st col
two_d_array[1][4] = 3
print two_d_array[1][4] # prints 3 # 2nd row, last col
two_d_array[4][4] = 4
print two_d_array[4][4] # prints 4 # last row, last col (right, bottom element of matrix)
2 years ago
如果在開始之前沒有大小資訊,則建立兩個一維清單 .
清單1:存儲行清單2:實際二維矩陣
将整行存儲在第一個清單中 . 完成後,将清單1附加到清單2中:
from random import randint
coordinates=[]
temp=[]
points=int(raw_input("Enter No Of Coordinates >"))
for i in range(0,points):
randomx=randint(0,1000)
randomy=randint(0,1000)
temp=[]
temp.append(randomx)
temp.append(randomy)
coordinates.append(temp)
print coordinates
輸出:
Enter No Of Coordinates >4
[[522, 96], [378, 276], [349, 741], [238, 439]]
2 years ago
通過使用清單:
matrix_in_python = [['Roy',80,75,85,90,95],['John',75,80,75,85,100],['Dave',80,80,80,90,95]]
通過使用dict:您還可以将此資訊存儲在哈希表中以便快速搜尋
matrix = { '1':[0,0] , '2':[0,1],'3':[0,2],'4' : [1,0],'5':[1,1],'6':[1,2],'7':[2,0],'8':[2,1],'9':[2,2]};
矩陣['1']會給你O(1)時間的結果
*nb :您需要處理哈希表中的沖突
2 years ago
l=[[0]*(L) for i in range(W)]
将比以下更快:
l = [[0 for x in range(L)] for y in range(W)]
2 years ago
使用:
import copy
def ndlist(*args, init=0):
dp = init
for x in reversed(args):
dp = [copy.deepcopy(dp) for _ in range(x)]
return dp
l = ndlist(1,2,3,4) # 4 dimensional list initialized with 0's
l[0][1][2][3] = 1
我認為NumPy是要走的路 . 如果您不想使用NumPy,以上是通用的 .
2 years ago
您應該列出一個清單,最好的方法是使用嵌套的了解:
>>> matrix = [[0 for i in range(5)] for j in range(5)]
>>> pprint.pprint(matrix)
[[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]]
在您的 [5][5] 示例中,您正在建立一個包含整數"5"的清單,并嘗試通路其第5項,這自然會引發IndexError,因為沒有第5項:
>>> l = [5]
>>> l[5]
Traceback (most recent call last):
File "", line 1, in
IndexError: list index out of range
2 years ago
如果要建立空矩陣,則使用正确的文法
matrix = [[]]
如果你想生成一個大小為5的矩陣,填充0,
matrix = [[0 for i in xrange(5)] for i in xrange(5)]
2 years ago
在Python中,您将建立一個清單清單 . 您不必提前聲明尺寸,但可以 . 例如:
matrix = []
matrix.append([])
matrix.append([])
matrix[0].append(2)
matrix[1].append(3)
現在matrix [0] [0] == 2和matrix [1] [0] == 3.您還可以使用清單推導文法 . 此示例使用它兩次來建構“二維清單”:
from itertools import count, takewhile
matrix = [[i for i in takewhile(lambda j: j < (k+1) * 10, count(k*10))] for k in range(10)]
2 years ago
這就是我通常在python中建立2D數組的方法 .
col = 3
row = 4
array = [[0] * col for _ in range(row)]
與在清單推導中使用for循環相比,我發現這種文法很容易記住 .
2 years ago
使用:
matrix = [[0]*5 for i in range(5)]
第一個次元的* 5起作用,因為在此級别資料是不可變的 .
2 years ago
rows = int(input())
cols = int(input())
matrix = []
for i in range(rows):
row = []
for j in range(cols):
row.append(0)
matrix.append(row)
print(matrix)
為什麼這麼長的代碼,你問_496093?
很久以前,當我對Python不熟悉的時候,我看到單行回答編寫2D矩陣,并告訴自己我不會再在Python中使用二維矩陣 . (那些單行非常可怕,它沒有給我任何有關Python正在做什麼的資訊 . 另請注意,我不知道這些簡寫 . )
無論如何,這裡是來自C,CPP和Java背景的初學者的代碼
Python愛好者和專家的注意事項:請不要因為我寫了詳細的代碼而拒絕投票 .
2 years ago
接受的答案是好的和正确的,但我花了一段時間才明白我也可以用它來建立一個完全空的數組 .
l = [[] for _ in range(3)]
結果是
[[], [], []]
2 years ago
我用逗号分隔檔案讀取如下:
data=[]
for l in infile:
l = split(',')
data.append(l)
清單“data”然後是具有索引資料的清單清單[row] [col]
2 years ago
如果您希望能夠将其視為2D數組,而不是被迫在清單清單中進行思考(在我看來更自然),您可以執行以下操作:
import numpy
Nx=3; Ny=4
my2Dlist= numpy.zeros((Nx,Ny)).tolist()
結果是一個清單(不是NumPy數組),你可以用數字,字元串等來覆寫各個位置 .
2 years ago
如果你真的想要一個矩陣,你可能最好使用 numpy . numpy 中的矩陣運算通常使用具有兩個次元的數組類型 . 建立新數組的方法有很多種;其中最有用的是 zeros 函數,它接受一個shape參數并傳回給定形狀的數組,其值初始化為零:
>>> import numpy
>>> numpy.zeros((5, 5))
array([[ 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.]])
numpy 也提供 matrix 類型 . 它不太常用,有些人使用它 . 但它對于從Matlab和其他一些環境中來到 numpy 的人來說很有用 . 我以為我正在談論矩陣!
>>> numpy.matrix([[1, 2], [3, 4]])
matrix([[1, 2],
[3, 4]])
以下是建立二維數組和矩陣的一些其他方法(為了緊湊性而删除了輸出):
numpy.matrix('1 2; 3 4') # use Matlab-style syntax
numpy.arange(25).reshape((5, 5)) # create a 1-d range and reshape
numpy.array(range(25)).reshape((5, 5)) # pass a Python range and reshape
numpy.array([5] * 25).reshape((5, 5)) # pass a Python list and reshape
numpy.empty((5, 5)) # allocate, but don't initialize
numpy.ones((5, 5)) # initialize with ones
numpy.ndarray((5, 5)) # use the low-level constructor
2 years ago
以下是初始化清單清單的簡短表示法:
matrix = [[0]*5 for i in range(5)]
不幸的是,縮短到像 5*[5*[0]] 這樣的東西并沒有真正起作用,因為你最終得到了同一個清單的5個副本,是以當你修改其中一個時它們都會改變,例如:
>>> matrix = 5*[5*[0]]
>>> matrix
[[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]]
>>> matrix[4][4] = 2
>>> matrix
[[0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2]]
2 years ago
聲明一個零(一)個矩陣:
numpy.zeros((x, y))
例如
>>> numpy.zeros((3, 5))
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
或numpy.ones((x,y))例如
>>> np.ones((3, 5))
array([[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]])
2 years ago
您在技術上嘗試索引未初始化的數組 . 在添加項目之前,您必須首先使用清單初始化外部清單; Python稱之為“清單了解” .
# Creates a list containing 5 lists, each of 8 items, all set to 0
w, h = 8, 5;
Matrix = [[0 for x in range(w)] for y in range(h)]
您現在可以向清單中添加項目:
Matrix[0][0] = 1
Matrix[6][0] = 3 # error! range...
Matrix[0][6] = 3 # valid
print Matrix[0][0] # prints 1
x, y = 0, 6
print Matrix[x][y] # prints 3; be careful with indexing!
雖然您可以按照自己的意願命名它們,但我這樣看是為了避免索引可能産生的混淆,如果對内部和外部清單使用“x”,并且想要非方形矩陣 .
2 years ago
如果你想要的隻是一個二維容器來容納一些元素,你可以友善地使用字典:
Matrix = {}
然後你可以這樣做:
Matrix[1,2] = 15
print Matrix[1,2]
這是有效的,因為 1,2 是一個元組,并且您将它用作索引字典的鍵 . 結果類似于啞稀疏矩陣 .
如osa和Josap Valls所示,您還可以使用 Matrix = collections.defaultdict(lambda:0) ,以便缺少的元素具有預設值 0 .
Vatsal進一步指出,這種方法對于大型矩陣可能效率不高,而且隻能用于代碼的非性能關鍵部分 .