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

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

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

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

Q&A

解決済

2回答

295閲覧

0でない要素だけについて、行方向位置、列方向位置、値をファイルに書き込みたい

yyicp

総合スコア60

Python

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

1グッド

0クリップ

投稿2025/02/26 02:07

編集2025/02/26 02:16

実現したいこと

こちらの関連質問です。

sample.csvの中身は以下の通りです。(これは具体例として挙げただけで、実際の行列はもっと巨大です)

1 0
2 3

今、各行の0でない要素だけの行方向位置、列方向位置、値をファイルに書き込みたいです。

「該当のソースコード」を実行すると、以下の画面になります。

イメージ説明

「試したこと」まではできましたが、どのように直したら良いか分かりません。どなたか教えてください。

該当のソースコード

python

1import numpy as np 2import pandas as pd 3import csv 4 5lst = pd.read_csv("sample.csv",header=None).values.tolist() 6print(lst)#[[1, 0], [2, 3]] 7 8nz = [i.tolist() for i in np.nonzero(lst)] 9for j, i in zip(*nz): 10 print(f'{j=}') 11 print(f'{i=}') 12 print(lst[j][i], end='\n\n')

試したこと

下記のコードでは
ans0.txtが
0
0
1

ans1.txtが
1
1
3

になってしまいました

ans1.txtに
1
0
2
が書き込む方法を教えてください。

python

1for j, i in zip(*nz): 2 filename = "ans%d.txt" % j 3 file = open(filename, 'w') 4 file.write(str(j)+'\n') 5 file.write(str(i)+'\n') 6 file.write(str(lst[j][i])+'\n') 7 file.write('\n')
tatsu99👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

今のコードで、open()のときのモードを追記(append)にしてやればできると思います。
(closeしないといけないので with ブロックにしています)

python

1for j, i in zip(*nz): 2 filename = "ans%d.txt" % j 3 with open(filename, 'a') as file: 4 file.write(str(j)+'\n') 5 file.write(str(i)+'\n') 6 file.write(str(lst[j][i])+'\n') 7 file.write('\n')

毎回 open/close するのが効率的に悪いと思うなら、j の値を記憶しておいて変化したときだけ開きなおすとか、

python

1cur_j = ns[0][0] 2file = open('ans%d.txt' % cur_j, 'w') 3 4for j, i in zip(*nz): 5 if j != cur_j: 6 file.close() 7 cur_j = j 8 file = open('ans%d.txt' % cur_j, 'w') 9 file.write(str(j)+'\n') 10 file.write(str(i)+'\n') 11 file.write(str(lst[j][i])+'\n') 12 file.write('\n') 13file.close() 14

もしくはdict や groupby を使って j の塊ごとに処理できる形にデータを変形するのがいいと思います。

投稿2025/02/26 04:31

bsdfan

総合スコア4890

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

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

yyicp

2025/02/26 05:21

できました。 どうもありがとうございました。
guest

0

以下のコードでは pandas.DataFrame.iterrows() を利用して、行ごとにファイル(ans{i}.txt)への保存を行います。

python

1import pandas as pd 2 3df = pd.read_csv("sample.csv", header=None) 4for j, row in df[df.any(axis=1)].iterrows(): 5 with open(f'ans{j}.txt', 'w') as ans: 6 for i, value in row[row.ne(0)].items(): 7 ans.write(f'{j=}\n{i=}\n{value}\n\n')

追記

numpy.argwhere()itertools.groupby() を利用する場合です。

python

1import numpy as np 2import pandas as pd 3from itertools import groupby 4 5arr = pd.read_csv("sample.csv",header=None).to_numpy() 6for j, c_idx in groupby(np.argwhere(arr), key=lambda x: x[0]): 7 with open(f'ans{j}.txt', 'w') as ans: 8 for _, i in c_idx: 9 ans.write(f'j={j}\ni={i}\n{arr[j,i]}\n\n')

投稿2025/02/26 02:38

編集2025/02/26 13:15
melian

総合スコア21049

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

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

yyicp

2025/02/26 02:45

できました。 どうもありがとうございました。 結構大変なことになってしまっているという印象を受けました。 iとjを簡単に参照できるわけではないのですね。
melian

2025/02/26 03:11

結果を出力するファイルが単一であれば、もう少し簡略に書けるかもしれません。
yyicp

2025/02/26 04:20 編集

例えば、 10 print(f'{j=}') で表示される値を格納する変数を定義できれば良い話なのですが、それはできないのでしょうか。 直感的には、 A = 「10 print(f'{j=}') 」で表示する値 print(A) みたいな感じです。 きれいなコードではないかもしれませんが、以下のようにしても実現できることが分かりました。 for j in range(0,2,1): filename = "ans%d.txt" % j file = open(filename, 'w') for i in range(0,2,1): if lst[j][i]!=0: file.write(str(j)+'\n') file.write(str(i)+'\n') file.write(str(lst[j][i])+'\n') file.write('\n') file.close()
melian

2025/02/26 04:57 編集

> 表示される値を格納する変数を定義できれば良い話なのですが、それはできないのでしょうか。 編集した回答のコードでいいますと、row[row.ne(0)].index がそれに当たります。 > 以下のようにしても実現できることが分かりました。 回答のコードも apply と for j in c_idx: の二重ループ(行単位の処理と列単位での処理)になっていますので、構成は同じということになります。(書き方が異なるだけかと思います)
yyicp

2025/02/26 05:16

解説、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.32%

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

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

質問する

関連した質問