web-dev-qa-db-ja.com

Pythonで配列を宣言する方法

Python で配列を宣言するにはどうすればよいですか?

ドキュメントに配列への参照がありません。

411
pynewbie
variable = []

variableは空のリストを参照するようになりました*

もちろんこれは代入であり、宣言ではありません。 Pythonは動的に型付けされているので、Pythonでは「この変数はリスト以外のものを参照してはいけません」と言うことはできません。


*デフォルトの組み込みPython型は、配列ではなく、 list と呼ばれます。それは、異質なオブジェクトの集合を保持することができる任意の長さの順序付けられたコンテナです(それらのタイプは問題ではなく、自由に混在させることができます)。これをC - array型により近い型を提供する arrayモジュール と混同しないでください。内容は同種(すべて同じタイプ)でなければなりませんが、長さはまだ動的です。

312
sepp2k

実際には宣言していませんが、これがPythonで配列を作成する方法です。

from array import array
intarray = array('i')

詳細については配列モジュールを参照してください: http://docs.python.org/library/array.html

今、あなたは配列ではなく、リストがほしいと思うかもしれませんが、他の人はすでにそれに答えています。 :)

110
Lennart Regebro

これは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操作は高価です

これをチェックしてください 操作の複雑さの素晴らしい表

また、この図を見てください。ここでは、配列、参照の配列、およびリンクリストの間の最も重要な違いを示してみました。 arrays, arrays everywhere

96
Anton Purin

私はあなたが(意図した)最初の30個のセルがすでに満たされているリストが欲しいと思う。そう

   f = []

   for i in range(30):
       f.append(0)

これをどこに使用できるかの例は、フィボナッチ数列です。 Project Euler の問題2を参照

63
limitcracker

こうやって:

my_array = [1, 'rebecca', 'allard', 15]
36
canadiancreed

Pythonでは何も宣言していません。あなたはそれを使うだけです。 http://diveintopython.net のようなものから始めることをお勧めします。

15
bayer

計算には、次のように 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のように高速です。科学的環境でよく使われます。 こちら もっと...

13
Remi

私は通常a = [1,2,3]を実行しますが、これは実際にはlistですがarraysについてはこの正式な 定義を見てください

12
non sequitor

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()は順序付き同質シーケンスですが、リストは不均質シーケンスです。

12
hussam

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

10
Melvin

これはどう...

>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6
7
slehar

JohnMachinのコメント 本当の答えになるはずです。他のすべての答えは、私の考えでは単なる回避策です。そう:

array=[0]*element_count
7
csabinho

Lennartから続けて、同種多次元配列を実装する numpy もあります。

6
camh

Pythonはそれらを lists と呼んでいます。リストリテラルは角括弧とコンマで書くことができます。

>>> [6,28,496,8128]
[6, 28, 496, 8128]
6
Colonel Panic

私は文字列の配列を持っていて、Trueと同じ長さのブール値の配列が必要でした。これは私がしたことです

strs = ["Hi","Bye"] 
bools = [ True for s in strs ]
4
Pedro A. Aranda

リストを作成してそれらを配列に変換することも、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)
2
Amit Prafulla