質問するログイン新規登録

回答編集履歴

6

Pandas の read_csv() ではなく numpy.loadtxt() を使用、numpy.savetxt() でデータの書式を一括指定

2025/08/04 07:35

投稿

melian
melian

スコア21343

answer CHANGED
@@ -5,7 +5,6 @@
5
5
  import pandas as pd
6
6
 
7
7
  data_files = ['sample_before20.txt', 'sample_before30.txt']
8
-
9
8
  for f in data_files:
10
9
  # 4行ごとに読み込み(空行はスキップされる)
11
10
  blks = [blk.to_numpy() for blk in pd.read_csv(f, header=None, chunksize=4)]
@@ -25,26 +24,26 @@
25
24
  **追記**
26
25
 
27
26
  上記のコードでは各ブロックで相対値を計算していましたが、以下のコードではファイルからデータを読み込んでnumpy配列(3D array)にして全ブロックのy,z座標を相対値に変換しています。
28
-
27
+ ※ `numpy.loadtxt()` や `numpy.savetxt()` の API ドキュメントを確認してコードを書き換えました
29
28
  ```python
30
29
  import numpy as np
31
- import pandas as pd
32
30
  from glob import glob
33
31
 
34
32
  data_files = glob('*_before*.txt')
35
-
36
33
  for f in data_files:
37
- # 4行ごとに読み込み(空行はスキップされる)
34
+ # 4行ごとに分割(空行はスキップされる)
38
- blks = np.array([blk.to_numpy() for blk in pd.read_csv(f, header=None, chunksize=4)])
35
+ blks = np.loadtxt(f).reshape((-1, 4))
39
36
  # y, z座標を相対値に変換 / blks[0,1:3] は一番最初の塊のy, z座標
40
37
  blks[:,1:3] -= blks[0,1:3]
41
38
  after_file = f.replace('before', 'after')
42
39
  # ファイル(*_after*.txt)に保存
40
+ np.savetxt(after_file, blks, fmt='%d\n%d\n%d\n%.3f\n')
41
+ ## 上記の場合、出力ファイルの最終行に空行が挿入されてしまいますので、それを避けたい
42
+ ## 場合は以下の様に変更してください
43
- with open(after_file, 'w') as output:
43
+ # with open(after_file, 'w') as output:
44
- for i, blk in enumerate(blks):
44
+ # for i, blk in enumerate(blks):
45
- # 2番目以降のブロックでは空行を入れる
45
+ # # 2番目以降のブロックでは空行を入れる
46
- if i > 0: print('', file=output)
46
+ # if i > 0: print('', file=output)
47
- # 座標は整数、値はfloat型で保存
47
+ # # 座標は整数、値はfloat型で保存
48
- np.savetxt(output, blk[:3], fmt='%d')
49
- np.savetxt(output, blk[3], fmt='%.3f')
48
+ # np.savetxt(output, [blk], fmt='%d\n%d\n%d\n%.3f')
50
49
  ```

5

append モードから write モードに変更

2025/08/02 05:02

投稿

melian
melian

スコア21343

answer CHANGED
@@ -11,16 +11,11 @@
11
11
  blks = [blk.to_numpy() for blk in pd.read_csv(f, header=None, chunksize=4)]
12
12
  y0, z0 = blks[0][1:3,0] # 一番最初の塊のy, z座標
13
13
  after_file = f.replace('before', 'after')
14
- # 追記(append)モードで出力
14
+ # ファイル(*_after*.txt)に保存
15
- with open(after_file, 'a') as output:
15
+ with open(after_file, 'w') as output:
16
- # 最初に出力ファイルの内容を空にする
17
- output.seek(0, 0)
18
- output.truncate()
19
16
  for i, blk in enumerate(blks):
20
17
  # 2番目以降のブロックでは空行を入れる
21
- if i > 0:
22
- print('', file=output)
18
+ if i > 0: print('', file=output)
23
-
24
19
  blk[1] -= y0
25
20
  blk[2] -= z0
26
21
  # 座標は整数、値はfloat型で保存
@@ -44,11 +39,8 @@
44
39
  # y, z座標を相対値に変換 / blks[0,1:3] は一番最初の塊のy, z座標
45
40
  blks[:,1:3] -= blks[0,1:3]
46
41
  after_file = f.replace('before', 'after')
47
- # 追記(append)モードで出力
42
+ # ファイル(*_after*.txt)に保存
48
- with open(after_file, 'a') as output:
43
+ with open(after_file, 'w') as output:
49
- # 最初に出力ファイルの内容を空にする
50
- output.seek(0, 0)
51
- output.truncate()
52
44
  for i, blk in enumerate(blks):
53
45
  # 2番目以降のブロックでは空行を入れる
54
46
  if i > 0: print('', file=output)

4

別解を追記

2025/08/01 05:29

投稿

melian
melian

スコア21343

answer CHANGED
@@ -27,3 +27,32 @@
27
27
  np.savetxt(output, blk[:3], fmt='%d')
28
28
  np.savetxt(output, blk[3], fmt='%.3f')
29
29
  ```
30
+ **追記**
31
+
32
+ 上記のコードでは各ブロックで相対値を計算していましたが、以下のコードではファイルからデータを読み込んでnumpy配列(3D array)にして全ブロックのy,z座標を相対値に変換しています。
33
+
34
+ ```python
35
+ import numpy as np
36
+ import pandas as pd
37
+ from glob import glob
38
+
39
+ data_files = glob('*_before*.txt')
40
+
41
+ for f in data_files:
42
+ # 4行ごとに読み込み(空行はスキップされる)
43
+ blks = np.array([blk.to_numpy() for blk in pd.read_csv(f, header=None, chunksize=4)])
44
+ # y, z座標を相対値に変換 / blks[0,1:3] は一番最初の塊のy, z座標
45
+ blks[:,1:3] -= blks[0,1:3]
46
+ after_file = f.replace('before', 'after')
47
+ # 追記(append)モードで出力
48
+ with open(after_file, 'a') as output:
49
+ # 最初に出力ファイルの内容を空にする
50
+ output.seek(0, 0)
51
+ output.truncate()
52
+ for i, blk in enumerate(blks):
53
+ # 2番目以降のブロックでは空行を入れる
54
+ if i > 0: print('', file=output)
55
+ # 座標は整数、値はfloat型で保存
56
+ np.savetxt(output, blk[:3], fmt='%d')
57
+ np.savetxt(output, blk[3], fmt='%.3f')
58
+ ```

3

truncate 処理の位置を変更

2025/08/01 04:14

投稿

melian
melian

スコア21343

answer CHANGED
@@ -13,13 +13,12 @@
13
13
  after_file = f.replace('before', 'after')
14
14
  # 追記(append)モードで出力
15
15
  with open(after_file, 'a') as output:
16
+ # 最初に出力ファイルの内容を空にする
17
+ output.seek(0, 0)
18
+ output.truncate()
16
19
  for i, blk in enumerate(blks):
17
- if i == 0:
18
- # 最初に出力ファイルの内容を空にする
19
- output.seek(0, 0)
20
- output.truncate()
21
- else:
22
- # 2番目以降のブロックでは空行を入れる
20
+ # 2番目以降のブロックでは空行を入れる
21
+ if i > 0:
23
22
  print('', file=output)
24
23
 
25
24
  blk[1] -= y0

2

2025/08/01 03:44

投稿

melian
melian

スコア21343

answer CHANGED
@@ -11,11 +11,9 @@
11
11
  blks = [blk.to_numpy() for blk in pd.read_csv(f, header=None, chunksize=4)]
12
12
  y0, z0 = blks[0][1:3,0] # 一番最初の塊のy, z座標
13
13
  after_file = f.replace('before', 'after')
14
+ # 追記(append)モードで出力
15
+ with open(after_file, 'a') as output:
14
- for i, blk in enumerate(blks):
16
+ for i, blk in enumerate(blks):
15
- blk[1] -= y0
16
- blk[2] -= z0
17
- # 追記(append)モードで出力
18
- with open(after_file, 'a') as output:
19
17
  if i == 0:
20
18
  # 最初に出力ファイルの内容を空にする
21
19
  output.seek(0, 0)
@@ -23,6 +21,9 @@
23
21
  else:
24
22
  # 2番目以降のブロックでは空行を入れる
25
23
  print('', file=output)
24
+
25
+ blk[1] -= y0
26
+ blk[2] -= z0
26
27
  # 座標は整数、値はfloat型で保存
27
28
  np.savetxt(output, blk[:3], fmt='%d')
28
29
  np.savetxt(output, blk[3], fmt='%.3f')

1

2025/08/01 03:38

投稿

melian
melian

スコア21343

answer CHANGED
@@ -14,9 +14,15 @@
14
14
  for i, blk in enumerate(blks):
15
15
  blk[1] -= y0
16
16
  blk[2] -= z0
17
+ # 追記(append)モードで出力
17
18
  with open(after_file, 'a') as output:
19
+ if i == 0:
20
+ # 最初に出力ファイルの内容を空にする
21
+ output.seek(0, 0)
22
+ output.truncate()
23
+ else:
18
- # ブロックとの間に空行を出力
24
+ # 2番目以降のブロックでは空行を入れる
19
- if i > 0: print('', file=output)
25
+ print('', file=output)
20
26
  # 座標は整数、値はfloat型で保存
21
27
  np.savetxt(output, blk[:3], fmt='%d')
22
28
  np.savetxt(output, blk[3], fmt='%.3f')