このように初期化された長さなしで二次元配列を定義したいです。
Matrix = [][]
しかし、それはうまくいきません...
以下のコードを試してみましたが、それも間違っています。
Matrix = [5][5]
エラー:
Traceback ...
IndexError: list index out of range
私の間違いは何ですか?
あなたは技術的に未初期化配列にインデックスを付けようとしています。項目を追加する前に、まず外部リストをリストで初期化する必要があります。 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"を使用し、非正方行列が必要な場合は、インデックス付けで発生する可能性がある混乱を避けるために、このようにして名前を付けます。
もし本当に行列が欲しいのなら、numpy
を使うほうがいいかもしれません。 numpy
の行列演算は、ほとんどの場合、2次元の配列型を使用します。新しい配列を作成する方法はたくさんあります。最も有用な関数の1つは、形状パラメーターを受け取り、値をゼロに初期化して、指定された形状の配列を返すzeros
関数です。
>>> 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]])
2次元配列と行列を作成する他の方法は次のとおりです(コンパクトにするために出力は削除されています)。
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
これはリストのリストを初期化するための短い表記です。
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]]
空行列を作成したい場合は、正しい構文は次のとおりです。
matrix = [[]]
そして、0で埋められたサイズ5の行列を生成したいなら、
matrix = [[0 for i in xrange(5)] for i in xrange(5)]
必要なものがいくつかの要素を保持するための二次元コンテナであるならば、代わりに辞書を便利に使うことができます:
Matrix = {}
それからあなたはすることができます:
Matrix[1,2] = 15
print Matrix[1,2]
1,2
はTupleなので、これは機能します。辞書を索引付けするためのキーとして使用しています。結果は、ダムスパース行列に似ています。
OsaとJosap Vallsによって示されているように、欠けている要素がデフォルト値0
を持つようにMatrix = collections.defaultdict(lambda:0)
を使うこともできます。
さらにVatsal氏は、この方法は大規模な行列にはあまり効率的ではないので、コードのパフォーマンスが重要ではない部分でのみ使用するべきであると指摘しています。
Pythonでは、リストのリストを作成します。寸法を事前に宣言する必要はありませんが、可能です。例えば:
matrix = []
matrix.append([])
matrix.append([])
matrix[0].append(2)
matrix[1].append(3)
ここで、matrix [0] [0] == 2およびmatrix [1] [0] == 3です。リスト内包表記構文を使用することもできます。この例では、これを2回使用して「2次元リスト」を作成します。
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)]
受け入れられた答えは良くて正しいですが、私はそれを使って完全に空の配列を作ることもできることを理解するのに少し時間がかかりました。
l = [[] for _ in range(3)]
になります
[[], [], []]
あなたはリストのリストを作るべきです、そして最良の方法は入れ子にされた内包表記を使うことです:
>>> 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番目の項目にアクセスしようとします。5番目の項目がないため、当然IndexErrorが発生します。
>>> l = [5]
>>> l[5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
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)
Python
name__でも、こんなに長いコードなのかと尋ねるのはなぜですか。
私がPythonに慣れていなかった昔、私は2D行列を書くための単一行の答えを見て、私は二次元行列をPythonで再び使うつもりはないと自分に言いました。 (これらの単一行はかなり怖かったので、Pythonが何をしていたのかについての情報は何も得られませんでした。また、これらの短所については私は知りません。)
とにかく、これはC、CPP、そしてJavaのバックグラウンドから来た初心者のためのコードです。
Pythonの愛好家や専門家への注意:私が詳細なコードを書いたという理由だけで投票しないでください。
ゼロの行列(1)を宣言するには:
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.]])
3次元でも可能です。( http://www.astro.ufl.edu/~warner/prog/python.html - >多次元配列を参照)
つかいます:
matrix = [[0]*5 for i in range(5)]
最初の次元の* 5は、このレベルではデータが不変であるため機能します。
読みやすくするための書き直し:
# 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)
私は最初の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
NumPyを使うと、空行列を次のように初期化できます。
import numpy as np
mm = np.matrix([])
そして後でこのようなデータを追加します。
mm = np.append(mm, [[1,2]], axis=1)
これが私がPythonで通常2D配列を作成する方法です。
col = 3
row = 4
array = [[0] * col for _ in range(row)]
この構文は、リスト内包表記でto forループを使用するのに比べて覚えやすいものです。
私はこのようにカンマ区切りのファイルで読みます:
data=[]
for l in infile:
l = split(',')
data.append(l)
リスト "data"は、インデックスデータを持つリストのリストです。
リストのリストで考えることを余儀なくされるのではなく、2D配列として考えることができるようにしたい場合(私の考えではもっと自然なことです)、次のことができます。
import numpy
Nx=3; Ny=4
my2Dlist= numpy.zeros((Nx,Ny)).tolist()
結果はリスト(NumPy配列ではありません)になり、個々の位置を数字や文字列などで上書きすることができます。
つかいます:
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を使いたくないのなら、上記は一般的なものです。
# Creates a list containing 5 lists initialized to 0
Matrix = [[0]*5]*5
この短い表現には注意してください。@ F.Jの回答の下の詳しい説明を参照
matrix = {}
2つの方法で keys および values を定義できます。
matrix[0,0] = value
または
matrix = { (0,0) : value }
結果:
[ value, value, value, value, value],
[ value, value, value, value, value],
...
開始前にサイズ情報がない場合は、2つの1次元リストを作成してください。
リスト1:行を格納するリスト2:実際の2次元行列
行全体を1番目のリストに格納します。完了したら、リスト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]]
リストを使用して:
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) timeという結果になります
* nb :ハッシュテーブルの衝突に対処する必要がある
以下のように、2つ以上の角括弧または3番目の角括弧([]
、カンマ区切り)を角括弧でネストすることにより、空の2次元リストを作成できます。
Matrix = [[], []]
ここで、Matrix[0][0]
に1を追加して、次のように入力するとします。
Matrix[0].append(1)
ここで、Matrixと入力してEnterキーを押します。出力は次のようになります。
[[1], []]
l=[[0]*(L) for i in range(W)]
より速くなります。
l = [[0 for x in range(L)] for y in range(W)]
事前に定義された数の行列が必要な場合は、次のコードを使用できます。
def matrix(rows, cols, start=0):
return [[c + start + r * cols for c in range(cols)] for r in range(rows)]
assert matrix(2, 3, 1) == [[1, 2, 3], [4, 5, 6]]
これを試して:
rows = int(input('Enter rows\n'))
my_list = []
for i in range(rows):
my_list.append(list(map(int, input().split())))