質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1184閲覧

乱数を用いた多次元配列を作成し、任意の要素を取り出したい

4SC11

総合スコア1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/03 06:26

編集2021/11/03 06:54

前提・実現したいこと

Pythonで乱数を用いて30行2列の2次元配列を作成し、csvファイルに出力しています。
また、そのcsvファイルからランダムに1つの要素を選んでくるというプログラムを完成させたいと考えています。

プログラム初心者なので言葉足らずな部分や間違えてしまっている部分もあるかと思います。
その際はそこも含めてご教授してくださると幸いです。

発生している問題・エラーメッセージ

・csvに書き込む際に、2行30列で読み込まれてしまっている。←これは数値を入れ替えれば解決できるがcsvファイルが見にくくなってしまう。 ・2次元配列の1つ目の要素を取り出すため、print(i[0][0])のように書くと、  例えばi = [[1.244, 2.376], [3.765, 9.355]]の場合、理想はprint(i[0][0]) = 1.244なのだが、print(i[0][0]) = 1と出力されてしまう

該当のソースコード

ソースコード1(csvに書き込むためのもの) import numpy as np from numpy.random import * import csv egg = [] egg = rand(30, 2) * 10 np.savetxt('dataset1.csv', egg, delimiter=',', fmt='%.20f') print('書き込みが正常に終わりました') ------------------------------------------------------------------------- ソースコード2(ソースコード1からある要素を取り出すためのもの) import csv csv_file = open("./dataset1.csv", "r", encoding="ms932", errors="", newline="") f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True) for i in f: print(i[0]) print(i[0][0])

試したこと

・ソースコード1の30と2を入れ替える→おそらく30行2列にはなったがcsvファイルが見にくい。また、ソースコード2の不具合は解消されない。

補足情報(FW/ツールのバージョンなど)

ソースコード1の実行結果(csvファイル)
イメージ説明

ソースコード2の実行結果
イメージ説明
ソースコード1の左側が抽出される

ソースコード1の30と2を入れ替えた実行結果(csv)
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

以下のコードで、いかがでしょう。

csv_file = open("./dataset1.csv", "r", encoding="ms932", errors="") f = np.loadtxt(csv_file, delimiter=',') print(f) print(f[0][0])

以下の、サイトを参照ください。
NumPyでCSVファイルを読み込み・書き込み(入力・出力)

投稿2021/11/04 01:00

coffeebar

総合スコア140

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

4SC11

2021/11/04 04:41

できました!! ありがとうございます!!
guest

0

はじめまして。
1つ目の質問(CSVがみにくい)は力不足で回答できかねますが、2つ目の質問(print[0][0]が思い通りに行かない)は解消できそうです。

まず、Pythonにおけるfor文について誤解があるように思いました。ここでのi変数にはf変数から取り出された一次元配列のデータが入っているのです。
そして"print(i[0][0])"が"1"を返すのは、"1.244..."の1文字目を返しているからです。

for i in f: print(i) # ['2.46709084185608329420', '4.33920634671205363020'] print(i[0]) # 2.46709084185608329420 print(i[0][0]) # 2 (i[0]の1文字目)

単純にn行目・m列目のデータがほしいのであればfor文を使わずに、このようにすればよいです。

import csv csv_file = open("./dataset1.csv", "r", encoding="ms932", errors="", newline="") f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True) n = 2 # 2行目を指定 m = 3 # 3列目を指定 print(i[n][m]) # 4.26319600790370500931

投稿2021/11/03 07:51

Hayaaaaaa

総合スコア46

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

4SC11

2021/11/03 14:40

回答ありがとうございます。 for文を使わない方を実行(iが定義されてないと言われたのでfに変更)してみたのですが、 '_csv.reader' object is not subscriptable このようなエラー分が返ってきました。 もしよろしければ、このエラーの直し方もご教授下さると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問