回答編集履歴

2

追記

2020/11/07 01:57

投稿

LouiS0616
LouiS0616

スコア35668

test CHANGED
@@ -7,3 +7,159 @@
7
7
  ---
8
8
 
9
9
  テキスト形式で無くても良いなら[np.save](https://numpy.org/doc/stable/reference/generated/numpy.save.html)が手軽でしょう。
10
+
11
+ ```Python
12
+
13
+ np.save(f'{file_name}.npy', ndarray)
14
+
15
+ ```
16
+
17
+
18
+
19
+ 読み込むときも[np.load](https://numpy.org/doc/stable/reference/generated/numpy.load.html#numpy.load)が使えます。
20
+
21
+
22
+
23
+ 計測
24
+
25
+ ---
26
+
27
+ 3回ファイル書き出しを行って平均を取ります。
28
+
29
+
30
+
31
+ **環境**
32
+
33
+ ```cmd
34
+
35
+ C:...>ver
36
+
37
+ Microsoft Windows [Version 10.0.18363.1139]
38
+
39
+
40
+
41
+ C:...>python --version
42
+
43
+ Python 3.7.7
44
+
45
+ ```
46
+
47
+
48
+
49
+ **コード**
50
+
51
+ ```Python
52
+
53
+ import csv
54
+
55
+ import timeit
56
+
57
+
58
+
59
+ import numpy as np
60
+
61
+
62
+
63
+
64
+
65
+ def func1(file_name, ndarray):
66
+
67
+ """aiai8976さんの方法"""
68
+
69
+ with open(file_name, 'w') as f:
70
+
71
+ writer = csv.writer(f)
72
+
73
+ for value in ndarray:
74
+
75
+ writer.writerow(value)
76
+
77
+
78
+
79
+ def func2(file_name, ndarray):
80
+
81
+ """Moineau26518805さんの方法"""
82
+
83
+ ndarray = "\n".join([",".join([str(n) for n in narray]) for narray in ndarray])
84
+
85
+ with open(file_name, 'w') as f:
86
+
87
+ f.write(ndarray)
88
+
89
+
90
+
91
+ def func3(file_name, ndarray):
92
+
93
+ """toast-uzさんの方法"""
94
+
95
+ sample = np.apply_along_axis(lambda x: f"[{' '.join(x)}]", 2, ndarray.astype(str))
96
+
97
+ np.savetxt(file_name, sample, delimiter=',', fmt='%s')
98
+
99
+
100
+
101
+ def func4(file_name, ndarray):
102
+
103
+ """LouiS0616の方法"""
104
+
105
+ np.save(f'{file_name}.npy', ndarray)
106
+
107
+
108
+
109
+
110
+
111
+ if __name__ == '__main__':
112
+
113
+ ndarray = np.random.randint(0, 256, size=(720, 1080, 3))
114
+
115
+ repeat = 3
116
+
117
+
118
+
119
+ for i, func in enumerate([func1, func2, func3, func4]):
120
+
121
+ print(func.__doc__)
122
+
123
+ print(
124
+
125
+ '\t' +
126
+
127
+ '{}回繰り返した結果: {:.3f}秒かかりました。'.format(
128
+
129
+ repeat,
130
+
131
+ timeit.timeit(lambda: func(f'sample{i}.csv', ndarray), number=repeat)
132
+
133
+ )
134
+
135
+ )
136
+
137
+ ```
138
+
139
+
140
+
141
+ **結果**
142
+
143
+ ||必要秒数(3回)|
144
+
145
+ |:--|--:|
146
+
147
+ |aiai8976さんの方法|107.394秒|
148
+
149
+ |Moineau26518805さんの方法|111.174秒|
150
+
151
+ |toast-uzさんの方法|24.352秒|
152
+
153
+ |私の方法(np.save)|0.027秒|
154
+
155
+
156
+
157
+ ---
158
+
159
+ 私の方法が高速なのはバイナリファイルを書き出しているからです。
160
+
161
+
162
+
163
+ バイナリ形式にも欠点はありますが、
164
+
165
+ **今回は出力が3次元なのでそもそもCSVの強みを活かせない**と考えます。

1

追記

2020/11/07 01:57

投稿

LouiS0616
LouiS0616

スコア35668

test CHANGED
@@ -1 +1,9 @@
1
1
  [np.savetxt](https://numpy.org/doc/stable/reference/generated/numpy.savetxt.html)は試してみましたか。delimiterを任意に指定できます。
2
+
3
+ 註: 1次元・2次元の場合のみ
4
+
5
+
6
+
7
+ ---
8
+
9
+ テキスト形式で無くても良いなら[np.save](https://numpy.org/doc/stable/reference/generated/numpy.save.html)が手軽でしょう。