- 締切済み
pythonの多次元配列へのデータ入力
pythonの多次元配列で以下のように、ループのカウンタのn,mで配列の位置を指定して代入することができないようです。このような場合どう処理するのでしょうか。 for n in range(1:10) for m in range(1:10) a[n][m]=f(n/m) なお、aについては使用の宣言はしておらず、メモリも確保されていません。fは別途用意されています。 また、a[2][3]=1.3 のように配列の場所を指定して代入するのもダメのようです。numpy.arrayとかで宣言するのかなと思うのですが。使用例が見つかりません。2次元配列だけでなく3次元配列だとどうなるかなと思うのですが。 科学技術計算はこんなのばっかりです。pythonはそのようなものに向くでしょうか。いろんなものがpython対応になってきているので速さの問題があっても器用な処理ができるのなら選択されることも多いと思いますが。 よろしくお願いします。
- skmsk1941093
- お礼率52% (611/1161)
- Python
- 回答数4
- ありがとう数2
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- f272
- ベストアンサー率46% (7998/17099)
> 1行目の宣言が必要、すなわち受け皿としての配列を最初に宣言しておく必要があるということでしょうか。 そうですね。 numpyを使うとしても,たぶんこんな感じ。 from numpy import * a = zeros((10, 10)) for n in range(1,10): for m in range(1,10): a[n][m]=f(n/m) print(a) > このように先にデータの格納先を決めておくのはCとかFortranのスタイルと同じであり、pythonっぽくないように思いました。 それが嫌なら a=[] for n in range(1,10): for m in range(1,10): a.append(f(n/m)) a = [a[i:i + 9] for i in range(0, len(a), 9)] print(a) こんな感じにもできる。 > また、def(x)の返り値(return)でx+1としているのはどうしてでしょうか。切り上げとかでしょうか。私の想定では実数なのですが。 適当な関数をでっち上げただけです。自分の使う関数に置き換えて考えてください。
- wormhole
- ベストアンサー率28% (1619/5653)
>配列という言葉はあまりpythonでは使われないのでしょうか。リスト、タプルというような説明が多いです。 まぁpythonで配列にあたるのはリストやタプルですから。
- f272
- ベストアンサー率46% (7998/17099)
こんな感じ a = [[0 for i in range(10)] for j in range(10)] def f(x): return x+1 for n in range(1,10): for m in range(1,10): a[n][m]=f(n/m) print(a)
- Nobu-W
- ベストアンサー率39% (725/1832)
https://techacademy.jp/magazine/18807 参考になりますか?
お礼
回答ありがとうございます。 このページは検索しておりました。配列のデータが先にあってそれを取り出す説明が中心だったように思います。配列形式のデータの1つ1つの要素に値を入れていく方法が示されていないように思いました。配列という言葉はあまりpythonでは使われないのでしょうか。リスト、タプルというような説明が多いです。どのテキストを見ても a=[[1,2,3], [3,5,2]] のようにプログラムの冒頭に配列データがあるという説明が多いように思うのですが。
関連するQ&A
- pythonでバイナリデータを配列に読み込みたい
python初心者なので、できるだけお手柔らかにお願いします。 pythonのバージョンは2.7.3です。 ===================================================== あるバイナリデータ(test.bin)から、 2バイトずつ100*100の2次元配列に読み込ませたいのですが、 配列への読み込ませ方が分からず悩んでいます。 ===================================================== #### ここから sampleスクリプト(未完) ################ f = open("./test.bin", "rb") x = 100 y = 100 bytesize = 2 data = f.read(bytesize*x*y) array = [[0 for j in range(x)] for i in range(y)] ############################################## 上記の後、arrayの各要素に2byteずつ整数値としてデータを読み込ませたいのですが、 dataからarrayへの受け渡し方法が分からず悩んでいます。 かなり初歩的な質問かも知れませんが、ヒントでもいいので教えて下さい。 また、上記の時点で誤っていることがありましたら ご教授お願いします。
- ベストアンサー
- その他(プログラミング・開発)
- Pythonにおける空要素での2次元配列作成の方法
現在、Pythonにおける空要素の2次元配列の作成(初期化)について、 初歩的な事柄でありながらも引っかかっています。 list1 = [] print(list1) #[] list2 = [[]for i in range(5)] print(list2) #[[], [], [], [], []] list3 = [[0 for i in range(5)] for j in range(3)] print(list3) #[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] list4 = [["" for i in range(5)] for j in range(3)] print(list4) #[['', '', '', '', ''], ['', '', '', '', ''], ['', '', '', '', '']] 各種解説サイトを探して、list3やlist4の形での作成方法は見つけたのですが、 list1やlist2のように、完全な空要素(null?)での方法は見当たらず、 自分でも手探りで試してみたのですが、うまくいきませんでした。 今欲している、 #[[], [], [], [], []], [[], [], [], [], []], [[], [], [], [], []] という出力を得るためには、どのように作成したらよろしいでしょうか。
- 締切済み
- Python
- 多次元配列への数値の代入。
こんにちは。 今、多次元配列への数値の代入の仕方で、悩んでいます。 A[][] = new int[n][n]; B[][] = new int[n][n]; 上記のようなn行n列の配列を宣言し、nを入力します。 例えば、n=100と入力すると、100行100列の配列を定義したことになり、Aの配列には1~10000、Bの配列には10001~20000の数値を代入、200×200であれば1~40000、40001~80000…という感じにしたいのですが、いいアイディアが浮かびません。 また、1~nの間でランダムに数値を選び、その数値を代入というのも考えましたが、Javaで乱数を代入できるのかな?という疑問が出来てしまい、わからなくなってしまいました。 何かいい考えがありましたら、ぜひ教えてください。 よろしくお願いします。
- ベストアンサー
- Java
- 3次元配列
初歩的な質問で申し訳ございません、非常に困っています 教えて下さい lotno(1~4,1~4,1~5) の3次元配列を宣言し、計算で求められた値を代入したいのですが どのように記述したらいいのでしょうか? また配列 lotno() はモジュール変数です
- ベストアンサー
- Visual Basic
- 3次元配列を1次元配列に
例えば2次元配列だと, array[row*i+j] = a[n]; といったように1次元に直すことができますよね? 同様に3次元配列を1次元配列にしたい場合には arrayの中はどのような式をつかえばいいのでしょうか。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 2次元配列のコピーについて
2次元配列のコピーについて質問があります。 $Aが元の2次元配列、$Bがコピー先だとして、 ${$A}[0..N][0..N]に値が入っているとします。 ここで、$Bの代入を、$B=$Aとやってしまうと、$Aと$Bが連動してしまいます。 ($Bが書き換わったのに$Aも書き換わる) これはなぜなのでしょうか。 また、$Bの代入を、配列を走査して foreach (0.. $#{$A}) { my ($i) = $_; foreach (0.. $#{${$A}[$i]}) { my ($j) = $_; ${$B}[$i][$j] = ${$A}[$i][$j]; } } とすれば問題ないのですが、あまりスマートだと思えません。 もっとスマートにコピーする方法はありますか?
- ベストアンサー
- Perl
- pythonでの配列の計算
pythonで、配列Aの各要素(数字)に対して別途定義された関数で計算して別の配列Bに保存する、ということを考えています(あまりにも初歩)。 Pythonでこのコードを書くことができません。CやFortranでは1つ1つの配列要素をループで巡って計算して新しい配列に保存するだけなのですが、Pythonだと配列のサイズの指定はしなくていいはずですね。また配列要素1つ1つを見て回るようなこともしなくていいと思います(裏ではやっているのでしょうが)。これはどういうコードになるでしょうか。ネットなどで調べても簡単すぎるのか逆にたどり着けないみたいです。よろしくお願いします。 私が使っているPythonのテキスト(分厚い)には索引に”配列”もありません。リスト、タプルになってしまったのでしょうか。 また、このような初歩的処理はJuliaでもいけるのではと思います。Pythonの文法を手掛かりにJuliaもできそうなので。
- 締切済み
- Python
- 多次元配列の処理について
多次元配列を扱った処理を行ないたいのですが、一部でnullを受け取ってしまい、処理を行うことができません。 引数の配列には次のようなテキストが入っています。 --配列の内容-- 0,名詞-一般,1,5, 0,名詞-数,2,6, 0,名詞-接尾-助数詞,3,7, -------------- この配列をコマンドラインに書き出すと正確に表示されます。 しかし、配列の内容を参照して処理を行なうと2列目の処理のときにnullを参照してしまいます。 プログラムは以下のとおりです。 ---プログラム--- public class Dist { public static int zairyo(String[][] date) { int a = 0; int b = 0; int c = 0; int d = 0; int e = 0; if(date != null) { int f = 0; System.out.println("//Dist//"); for(int m = 0; m < date.length; m++) { for(int n = 0; n < date[0].length; n++) { if(date[m][n] != null) { System.out.print(date[m][n] + "\t"); f++; if(f == date[0].length) { System.out.println(""); f = 0; } } } } for(int i = 0; i < date.length; i++) { if(date[i][1] != null) { if(date[i][1] == "名詞-一般") a++; if(date[i][1] == "名詞-数") b++; if(date[i][1] == "名詞-接尾-助数詞") c++; }else System.out.println("2列目null"); } int j = date.length - 1; d = Integer.parseInt(date[j][2]); e = Integer.parseInt(date[j][3]); }else System.out.println("Dist:null"); if(a > 0 && b > 0 && c > 0 && d <= 10 && e <= 15) { return 1; }else return 0; } } ------------------------ 原因は何なのでしょうか? ご教授お願いします。
- 締切済み
- Java
- 別次元配列への文字コピー
別次元配列への文字コピー(not文字列)をする際特別な制約ってありますか? 2次元配列から1次元配列への文字コピー 1次元配列から2次元配列への文字コピー などなど for(i=0,n=0;n<TEISU1;n++){ for(m=0;m<TEISU2;m++,i++){ strcpy(&ABC[m][n],&DEF[i]); printf(" i%d n%d m%d %c %x\n",i,n,m,ABC[m][n],DEF[m][n]); // ★★★★★↑この時点では正しく出ているが } } /**/printf("%s\n",ABC); // ★★★★★↑この時点では出力内容がおかしくなっている 原因がさっぱりわかりません。 原因はどういった事が考えられますか?
- ベストアンサー
- C・C++・C#
お礼
回答ありがとうございます。 確認です。1行目の宣言が必要、すなわち受け皿としての配列を最初に宣言しておく必要があるということでしょうか。このように先にデータの格納先を決めておくのはCとかFortranのスタイルと同じであり、pythonっぽくないように思いました。 また、def(x)の返り値(return)でx+1としているのはどうしてでしょうか。切り上げとかでしょうか。私の想定では実数なのですが。