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

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

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

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

Python

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

Q&A

解決済

1回答

1568閲覧

csvファイルの数値を読み込み,二次元フーリエ変換を行いたい

YuwaYuki

総合スコア1

CSV

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

Python

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

0グッド

0クリップ

投稿2022/04/19 07:15

編集2022/04/21 07:29

やりたいこと

①csvファイルの数値を読み込んで,二次元フーリエ変換(2DFFT)を行い,計算結果をcsvファイルで出力したいです.

pythonで書かれた1DFFTプログラム https://watlab-blog.com/2021/04/17/csv-dft/

こちらの2DFFT版を作りたいです.

②①で得られた結果から動径方向分布 p(r) と角度方向分布 q(θ)のスペクトル分布を算出したいです.

python スペクトル分析 https://teratail.com/questions/157585 

こちらは上記のものを参考にしたいと考えています.

困っている事

①のcsvファイルから数値を読み込み2DFFTを行う部分.

CSVファイルの中身

CSVファイルの中身はこのようになっています.
イメージ説明
実際には1行目とA列は削除しています.縦90×横82の数値データです.

試してみたこと

①2DFFT(C言語)の改造
初めはC言語で書かれた二次元フーリエ変換のプログラムを見つけたので改造してデータ部分や行列の数値を変更して2DFFTを行っていました.

二次元フーリエ変換 http://hooktail.org/computer/index.php?2%BC%A1%B8%B5%A5%D5%A1%BC%A5%EA%A5%A8%CA%D1%B4%B9

c言語

1#include<stdio.h> 2#include<math.h> 3#include"calculation.h" 4 5#define PI 3.1415926535897 6 7int samp[] = {0, 3.427308426, 0, 3.088006157, 1.499976379, 0, 0, 0, 4.731893003, 0, 8                             数値が膨大なため省略 9, 6.380783053, 0, 0, 0.136650868, 0}; 10 11int main() 12{ 13 double re[7380], im[7380]; 14 int i, j; 15 16 for(i=0; i<7380; i++){ 17 re[i] = samp[i]; 18 im[i] = 0; 19 } 20 21 for(i=0; i<90; i++){ 22 for(j=0; j<82; j++){ 23 printf("%.3d ", (int)re[i*82 + j]); 24 } 25 printf("\n"); 26 } 27 28 dft_swap2(re, im, 90, 82); 29 30 printf("\n"); 31 32 dft_idft2(re, im, 90, 82, DFT); 33 34 dft_swap2(re, im, 90, 82); 35 36 for(i=0; i<90; i++){ 37 for(j=0; j<82; j++){ 38 printf("%.3d ", (int)re[i*82 + j]); 39 } 40 printf("\n"); 41 } 42 43 printf("\n"); 44 45 dft_swap2(re, im, 90, 82); 46 47 dft_idft2(re, im, 90, 82, IDFT); 48 49 dft_swap2(re, im, 90, 82); 50 51 for(i=0; i<90; i++){ 52 for(j=0; j<82; j++){ 53 printf("%.3d ", (int)re[i*82 + j]); 54 } 55 printf("\n"); 56 } 57 printf("\n"); 58 59 return 0; 60}

しかし,毎度データごとにを書き換える作業がとても非効率なのでpythonで同様の事が行えないか試しました.

②画像の2DFFTのプログラム(python)の改造

pythonで書かれた画像の2DFFTのプログラム https://watlab-blog.com/2020/03/22/2d-fft/

画像を読み込む部分をcsvに置き換えれば上手くいくのでは?と考えましたが計算結果を出力する事が出来ませんでした.

Python

1import pandas as pd 2import numpy as np 3 4# csvを読み込み、2Dフーリエ変換をする 5df = pd.read_csv('date.csv') # csvを読み込み 6f = np.fft.fft2(df) # 2Dフーリエ変換 7f_shift = np.fft.fftshift(f) # 直流成分を中心に移動させるためN/2シフトさせる 8mag = 20 * np.log(np.abs(f_shift)) # 振幅成分を計算 9f.to_csv('out.csv') # フーリエ変換の結果をcsvに保存

質問

画像を読み込む部分をcsvに置き換えるアプローチは間違っていますか?間違えっている場合はどうすればよいでしょうか?

参考にしたもの一覧

  • pythonで書かれた1DFFTのプログラム ← これの2DFFT版を作りたい 

  https://watlab-blog.com/2021/04/17/csv-dft/

  • pythonで書かれた画像の2DFFTのプログラム

  https://watlab-blog.com/2020/03/22/2d-fft/

  • c言語で書かれた2DFFTのプログラム     

  http://hooktail.org/computer/index.php?2%BC%A1%B8%B5%A5%D5%A1%BC%A5%EA%A5%A8%CA%D1%B4%B9

  • 2DFFT後に行いたいスペクトル分布について

  https://teratail.com/questions/157585 

  • 2DFFTを行った後に求めたいグラフが乗っているレポート

 https://www.edu.kobe-u.ac.jp/eng-arch-sled/dat/research/adachi-kigami-1/1.pdf

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

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

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

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

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

jbpb0

2022/05/09 07:34 編集

> 実際には1行目とA列は削除しています. ならば、1行目をヘッダーとして扱われないようにしないといけません df = pd.read_csv('date.csv') ↓ 変更 (ファイル名も変えました) df = pd.read_csv('data.csv', header=None) 「f」はpandasのデータフレームではなくnumpy配列なので、「f.to_csv()」はできません numpy配列をcsvファイルに保存する方法もありますが、「.to_csv()」を使いたいなら、たとえばこうします f.to_csv('out.csv') ↓ 変更 pd.DataFrame(f).to_csv('out.csv') または pd.DataFrame(f).to_csv('out.csv', header=False, index=False) 「header=False, index=False」を付けるか付けないかで「out.csv」がどう変わるのかは、自分で実行して確認してみてください
jbpb0

2022/04/19 12:41 編集

計算が意図通りに正しく行われてるのかの確認は、答えが分かってる入力データで計算してみたらいかがでしょうか たとえば、全部のデータが「1.0」の場合は、フーリエ変換後の「f」は直流以外は全て「0.+0.j」で、直流は入力データ数になります 入力データのcsvファイルの形が下記のように5x5ならば、データ数は5x5=25なので、直流は「25.+0.j」になります 1.0,1.0,1.0,1.0,1.0 1.0,1.0,1.0,1.0,1.0 1.0,1.0,1.0,1.0,1.0 1.0,1.0,1.0,1.0,1.0 1.0,1.0,1.0,1.0,1.0
guest

回答1

0

ベストアンサー

実際には1行目とA列は削除しています.

ならば、1行目をヘッダーとして扱われないようにしないといけません

python

1df = pd.read_csv('date.csv')

↓ 変更 (ファイル名も変えました)

python

1df = pd.read_csv('data.csv', header=None)

 
「f」はpandasのデータフレームではなくnumpy配列なので、「f.to_csv()」はできません
numpy配列をcsvファイルに保存する方法もありますが、「.to_csv()」を使いたいなら、たとえばこうします

python

1f.to_csv('out.csv')

↓ 変更

python

1pd.DataFrame(f).to_csv('out.csv')

または

python

1pd.DataFrame(f).to_csv('out.csv', header=False, index=False)

「header=False, index=False」を付けるか付けないかで「out.csv」がどう変わるのかは、自分で実行して確認してみてください

投稿2022/05/09 07:33

jbpb0

総合スコア7651

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

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

YuwaYuki

2022/05/10 01:47

ご回答ありがとうございます. jdpb0さんの回答を元に修正し,実行したところ,欲しい結果が得られました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問