回答編集履歴
6
Pandas の read_csv() ではなく numpy.loadtxt() を使用、numpy.savetxt() でデータの書式を一括指定
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.
|
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
|
-
|
44
|
+
# for i, blk in enumerate(blks):
|
45
|
-
|
45
|
+
# # 2番目以降のブロックでは空行を入れる
|
46
|
-
|
46
|
+
# if i > 0: print('', file=output)
|
47
|
-
|
47
|
+
# # 座標は整数、値はfloat型で保存
|
48
|
-
np.savetxt(output, blk[:3], fmt='%d')
|
49
|
-
|
48
|
+
# np.savetxt(output, [blk], fmt='%d\n%d\n%d\n%.3f')
|
50
49
|
```
|
5
append モードから write モードに変更
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
|
-
#
|
14
|
+
# ファイル(*_after*.txt)に保存
|
15
|
-
with open(after_file, '
|
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
|
-
|
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
|
-
#
|
42
|
+
# ファイル(*_after*.txt)に保存
|
48
|
-
with open(after_file, '
|
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
別解を追記
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 処理の位置を変更
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
|
-
|
20
|
+
# 2番目以降のブロックでは空行を入れる
|
21
|
+
if i > 0:
|
23
22
|
print('', file=output)
|
24
23
|
|
25
24
|
blk[1] -= y0
|
2
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
|
-
|
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
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
|
-
|
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')
|