Numpy配列の最初の次元の一部のみを「サブフラット化」またはフラット化する簡単な方法はありますか?
たとえば、次元のnumpy配列(50,100,25)
を指定すると、結果の次元は(5000,25)
になります
numpy.reshape を見てください。
>>> arr = numpy.zeros((50,100,25))
>>> arr.shape
# (50, 100, 25)
>>> new_arr = arr.reshape(5000,25)
>>> new_arr.shape
# (5000, 25)
# One shape dimension can be -1.
# In this case, the value is inferred from
# the length of the array and remaining dimensions.
>>> another_arr = arr.reshape(-1, arr.shape[-1])
>>> another_arr.shape
# (5000, 25)
Alexanderの答えのわずかな一般化-np.reshapeは引数として-1を取ることができます。これは、「配列サイズの合計を、リストされている他のすべての次元の積で除算した」ことを意味します。
例えば最後の次元以外のすべてを平坦化するには:
>>> arr = numpy.zeros((50,100,25))
>>> new_arr = arr.reshape(-1, arr.shape[-1])
>>> new_arr.shape
# (5000, 25)
Peterの答えのわずかな一般化-3次元配列を超えたい場合は、元の配列の形状を超える範囲を指定できます。
例えば最後のtwo次元以外のすべてを平坦化するには:
arr = numpy.zeros((3, 4, 5, 6))
new_arr = arr.reshape(-1, *arr.shape[-2:])
new_arr.shape
# (12, 5, 6)
編集:私の以前の答えへのわずかな一般化-もちろん、形状変更の開始時に範囲を指定することもできます:
arr = numpy.zeros((3, 4, 5, 6, 7, 8))
new_arr = arr.reshape(*arr.shape[:2], -1, *arr.shape[-2:])
new_arr.shape
# (3, 4, 30, 7, 8)
別のアプローチは、次のようにnumpy.resize()
を使用することです。
In [37]: shp = (50,100,25)
In [38]: arr = np.random.random_sample(shp)
In [45]: resized_arr = np.resize(arr, (np.prod(shp[:2]), shp[-1]))
In [46]: resized_arr.shape
Out[46]: (5000, 25)
# sanity check with other solutions
In [47]: resized = np.reshape(arr, (-1, shp[-1]))
In [48]: np.allclose(resized_arr, resized)
Out[48]: True