Python で配列を宣言するにはどうすればよいですか?
ドキュメントに配列への参照がありません。
variable = []
variable
は空のリストを参照するようになりました*。
もちろんこれは代入であり、宣言ではありません。 Pythonは動的に型付けされているので、Pythonでは「この変数はリスト以外のものを参照してはいけません」と言うことはできません。
*デフォルトの組み込みPython型は、配列ではなく、 list と呼ばれます。それは、異質なオブジェクトの集合を保持することができる任意の長さの順序付けられたコンテナです(それらのタイプは問題ではなく、自由に混在させることができます)。これをC - array
型により近い型を提供する array
モジュール と混同しないでください。内容は同種(すべて同じタイプ)でなければなりませんが、長さはまだ動的です。
実際には宣言していませんが、これがPythonで配列を作成する方法です。
from array import array
intarray = array('i')
詳細については配列モジュールを参照してください: http://docs.python.org/library/array.html
今、あなたは配列ではなく、リストがほしいと思うかもしれませんが、他の人はすでにそれに答えています。 :)
これはPythonでは驚くほど複雑なトピックです。
配列はクラスlist
で表されます( reference を参照し、 generator と混在させないでください)。
使用例をチェックしてください。
# empty array
arr = []
# init with values (can contain mixed types)
arr = [1, "eels"]
# get item by index (can be negative to access end of array)
arr = [1, 2, 3, 4, 5, 6]
arr[0] # 1
arr[-1] # 6
# get length
length = len(arr)
# supports append and insert
arr.append(8)
arr.insert(6, 7)
内部的には、Pythonのlist
は、項目への参照を含む実際の配列のラッパーです。また、基礎となる配列はいくらかの追加スペースで作成されます。
この結果は次のとおりです。
arr[6653]
はarr[0]
と同じです)append
操作は「無料」であるが、余分なスペースがあるinsert
操作は高価ですこれをチェックしてください 操作の複雑さの素晴らしい表 。
私はあなたが(意図した)最初の30個のセルがすでに満たされているリストが欲しいと思う。そう
f = []
for i in range(30):
f.append(0)
これをどこに使用できるかの例は、フィボナッチ数列です。 Project Euler の問題2を参照
こうやって:
my_array = [1, 'rebecca', 'allard', 15]
Pythonでは何も宣言していません。あなたはそれを使うだけです。 http://diveintopython.net のようなものから始めることをお勧めします。
計算には、次のように numpy 配列を使用します。
import numpy as np
a = np.ones((3,2)) # a 2D array with 3 rows, 2 columns, filled with ones
b = np.array([1,2,3]) # a 1D array initialised using a list [1,2,3]
c = np.linspace(2,3,100) # an array with 100 points beteen (and including) 2 and 3
print(a*1.5) # all elements of a times 1.5
print(a.T+b) # b added to the transpose of a
これらのでこぼこした配列は(圧縮されていても)ディスクから保存およびロードすることができ、大量の要素を含む複雑な計算はCのように高速です。科学的環境でよく使われます。 こちら もっと...
私は通常a = [1,2,3]
を実行しますが、これは実際にはlist
ですがarrays
についてはこの正式な 定義を見てください
Pythonの配列はリストで表現されることを提案しました。これは間違いです。 Pythonは標準ライブラリモジュールarray
"array()
"にarray.array()
の独立した実装を持っているので、この2つを混同するのは正しくありません。リストはpythonのリストなので、使用される命名法には注意してください。
list_01 = [4, 6.2, 7-2j, 'flo', 'cro']
list_01
Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']
Listとarray.array()
の間には非常に重要な違いが1つあります。これらのオブジェクトはどちらも順序付きシーケンスですが、array.array()は順序付き同質シーケンスですが、リストは不均質シーケンスです。
Lennartの答えに加えて、次のように配列を作成することができます。
from array import array
float_array = array("f",values)
values は、Tuple、list、またはnp.arrayの形式をとることができますが、配列は指定できません。
values = [1,2,3]
values = (1,2,3)
values = np.array([1,2,3],'f')
# 'i' will work here too, but if array is 'i' then values have to be int
wrong_values = array('f',[1,2,3])
# TypeError: 'array.array' object is not callable
それでも出力は同じになります。
print(float_array)
print(float_array[1])
print(isinstance(float_array[1],float))
# array('f', [1.0, 2.0, 3.0])
# 2.0
# True
Listのほとんどのメソッドは配列でも動作します。一般的なものはpop()、extend()、append()です。
答えとコメントから判断すると、配列のデータ構造はそれほど一般的ではないようです。私はそれが好きです、リストの上にタプルを好むかもしれないのと同じ方法。
配列構造には、リストやnp.arrayよりも厳密な規則があります。これにより、特に数値データを扱うときに、エラーを減らしてデバッグを容易にすることができます。
Int配列にfloatを挿入/追加しようとするとTypeErrorがスローされます。
values = [1,2,3]
int_array = array("i",values)
int_array.append(float(1))
# or int_array.extend([float(1)])
# TypeError: integer argument expected, got float
整数であることを意味する値(例えばインデックスのリスト)を配列形式で保持すると、np.arrayやlistsと同様に、配列を繰り返し処理できるため、 "TypeError:リストのインデックスは浮動小数点ではなく整数でなければなりません"を防ぐことができます。
int_array = array('i',[1,2,3])
data = [11,22,33,44,55]
sample = []
for i in int_array:
sample.append(data[i])
厄介なことに、float配列にintを追加すると、例外をスローせずにintがfloatになります。
np.arrayはそのエントリに対しても同じデータ型を保持しますが、エラーを与えるのではなく、新しいエントリに合わせてデータ型を変更します(通常はdoubleまたはstr)。
import numpy as np
numpy_int_array = np.array([1,2,3],'i')
for i in numpy_int_array:
print(type(i))
# <class 'numpy.int32'>
numpy_int_array_2 = np.append(numpy_int_array,int(1))
# still <class 'numpy.int32'>
numpy_float_array = np.append(numpy_int_array,float(1))
# <class 'numpy.float64'> for all values
numpy_str_array = np.append(numpy_int_array,"1")
# <class 'numpy.str_'> for all values
data = [11,22,33,44,55]
sample = []
for i in numpy_int_array_2:
sample.append(data[i])
# no problem here, but TypeError for the other two
これは代入中も同様です。データ型が指定されている場合、np.arrayは可能な限りエントリをそのデータ型に変換します。
int_numpy_array = np.array([1,2,float(3)],'i')
# 3 becomes an int
int_numpy_array_2 = np.array([1,2,3.9],'i')
# 3.9 gets truncated to 3 (same as int(3.9))
invalid_array = np.array([1,2,"string"],'i')
# ValueError: invalid literal for int() with base 10: 'string'
# Same error as int('string')
str_numpy_array = np.array([1,2,3],'str')
print(str_numpy_array)
print([type(i) for i in str_numpy_array])
# ['1' '2' '3']
# <class 'numpy.str_'>
または、本質的には
data = [1.2,3.4,5.6]
list_1 = np.array(data,'i').tolist()
list_2 = [int(i) for i in data]
print(list_1 == list_2)
# True
一方、配列は単に与えるでしょう:
invalid_array = array([1,2,3.9],'i')
# TypeError: integer argument expected, got float
このため、型固有のコマンドにnp.arrayを使用することはお勧めできません。ここでは配列構造が役に立ちます。 listは値のデータ型を保持します。
そして、私がやや厄介だと思うものがあります。データ型はarray()の最初の引数として指定されていますが、(通常)np.array()の2番目の引数として指定されています。 :|
Cとの関係はここで参照されています: Pythonのリストvs.配列 - いつ使うの?
お楽しみください。
注意:型付けされたやや厳密な配列の性質は、PythonよりもCに寄りかかっており、設計上、Pythonはその関数に多くの型固有の制約を持っていません。その不評はまた共同作業に肯定的なフィードバックを作成し、それを取り替えることは大抵追加の[ファイル内のxに対するint(x)]を含む。したがって、配列の存在を無視することは完全に実行可能かつ妥当です。それは私たちの大部分をいかなる形でも妨げるべきではありません。 :D
これはどう...
>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6
JohnMachinのコメント 本当の答えになるはずです。他のすべての答えは、私の考えでは単なる回避策です。そう:
array=[0]*element_count
Lennartから続けて、同種多次元配列を実装する numpy もあります。
Pythonはそれらを lists と呼んでいます。リストリテラルは角括弧とコンマで書くことができます。
>>> [6,28,496,8128]
[6, 28, 496, 8128]
私は文字列の配列を持っていて、Trueと同じ長さのブール値の配列が必要でした。これは私がしたことです
strs = ["Hi","Bye"]
bools = [ True for s in strs ]
リストを作成してそれらを配列に変換することも、numpyモジュールを使用して配列を作成することもできます。以下は、同じことを説明するためのいくつかの例です。 Numpyはまた、多次元配列を扱うのを容易にします。
import numpy as np
a = np.array([1, 2, 3, 4])
#For custom inputs
a = np.array([int(x) for x in input().split()])
行列の次元として入力を受け取る関数reshapeを使って、この配列を2×2行列に変形することもできます。
mat = a.reshape(2, 2)