- 締切済み
pythonでの配列の計算
pythonで、配列Aの各要素(数字)に対して別途定義された関数で計算して別の配列Bに保存する、ということを考えています(あまりにも初歩)。 Pythonでこのコードを書くことができません。CやFortranでは1つ1つの配列要素をループで巡って計算して新しい配列に保存するだけなのですが、Pythonだと配列のサイズの指定はしなくていいはずですね。また配列要素1つ1つを見て回るようなこともしなくていいと思います(裏ではやっているのでしょうが)。これはどういうコードになるでしょうか。ネットなどで調べても簡単すぎるのか逆にたどり着けないみたいです。よろしくお願いします。 私が使っているPythonのテキスト(分厚い)には索引に”配列”もありません。リスト、タプルになってしまったのでしょうか。 また、このような初歩的処理はJuliaでもいけるのではと思います。Pythonの文法を手掛かりにJuliaもできそうなので。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- wormhole
- ベストアンサー率28% (1626/5665)
>appendを使う場合、今の状態(宣言してあるけれども空っぽ)に付け加えていく、という風に思われます。 (以下略) 「思われます」って・・・ https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range pythonのドキュメントを読めば書いてありますよ。
- notnot
- ベストアンサー率47% (4900/10359)
> 関数を定義してそれを配列に適用する、という処理と読めると思います。配列の要素1つ1つを取り出して処理して、新しい配列の要素に1つ1つ書き込むという操作はしない、あるいはできない、ということでしょうか。 できますよ。 b = [] for x in a: b.append(foo(x)) または、 b = [] for i in range(len(a)): b.append(foo(a[i])) または、 b = [None]*len(a) for i in range(len(a)): b[i] = foo(a[i]) 2つ目、3つ目の添え字を使うやり方はあまりしないと思います。 > ”処理は必ず関数で”、ということになるのでしょうか。 そんなことは無いです。 > pythonで、配列Aの各要素(数字)に対して別途定義された関数で計算して別の配列Bに保存する、ということを考えています と書いてあったので、関数を使うのがご希望かと思ったまで。 b = [x*x+2*x+1 for x in a] でもいいです。
- notnot
- ベストアンサー率47% (4900/10359)
CやFortranの配列はPythonではリストです。 def foo(x): return x*x+2*x+1 a = [1,2,3,4] b = list(map(foo, a)) または、 b = [foo(x) for x in a] 後者は「(リスト)内包表記」と言います。
お礼
回答ありがとうございます。 関数を定義してそれを配列に適用する、という処理と読めると思います。配列の要素1つ1つを取り出して処理して、新しい配列の要素に1つ1つ書き込むという操作はしない、あるいはできない、ということでしょうか。もしそれができると従来の言語と変わらないことになってしまいます。pythonはそこが違う、ということになるでしょうか。たぶんjuliaもそうなのだろうと思いますが。”処理は必ず関数で”、ということになるのでしょうか。
お礼
回答ありがとうございます。お時間を拝借しております。 appendを使う場合、今の状態(宣言してあるけれども空っぽ)に付け加えていく、という風に思われます。 そのため、今の状態に何か数値が入っている場合、書き足されているということになるように思われますが、その解釈でいいでしょうか。appendというのは他の言語でも使われており、ファイル出力のときにファイルが書き換わるのではなく、最後尾に付け加えられていくということですね。 3番目の例では、 b[i] = foo(a[i]) とあり、これは例えば、Fortranでもおなじみの処理のように思われますが、これは書き足しではなく、書き換えということになりますでしょうか。私は配列の書き換えが希望で、時間発展系の数値シミュレーションプログラムでは関数がかなり複雑になります。また、配列の書き換えではreturn x*x+2*x+1のように各配列の要素だけで演算するのではなく、x[10]->y[10]に進むとき、func(x[9],x[10],x[11])->y[10]ということになります。そのあとで出てきたy[]をそっくり新たなx[]にするという処理も必要になります。時間発展系の数値シミュレーションはそういう構造になっています。そのため3番目の方法を使いたいと思います。