Python масштабирование с 4D данными - PullRequest
1 голос
/ 31 октября 2019

У меня есть массив Python 4D с общей структурой:

tdata = [sample, x, y, channel]

с всеобъемлющими размерами [10000, 5, 5, 12]

, и я хотел бы сделать либоminmaxscaler или стандартизатор для данных. Проблема в том, что оба скейлера принимают только 2D данные. Если бы я хотел масштабировать каждый 2D-канал [x, y] для каждого сэмпла, есть ли эффективный способ сделать это вместо попытки:

for i in range(0,len(sample)):
    for j in range(0,len(channel)):
        transformed_tdata[i,:,:,j] = scaler.fit(tdata[i,:,:,j])

Но тогда бы каждый сэмпл не масштабировался независимо длякаждый канал?

1 Ответ

2 голосов
/ 31 октября 2019

Вы на правильном пути. Если вам нужен масштабатор для каждого канала, вы можете изменить форму каждого канала данных, чтобы они имели форму (10000, 5 * 5). Каждый канал (который раньше был 5x5) теперь имеет длину 25 векторов, и скалер будет работать. Вам нужно будет преобразовать данные оценки таким же образом с помощью скейлеров в channel_scalers.

import numpy as np

from sklearn.preprocessing import MinMaxScaler
n_channels = 12

tdata = np.random.rand(10000, 5, 5, n_channels)
tdata_transformed = np.zeros_like(tdata)

channel_scalers = []

for i in range(n_channels):
    mmx = MinMaxScaler()
    slc = tdata[:, :, :, i].reshape(10000, 5*5) # make it a bunch of row vectors
    transformed = mmx.fit_transform(slc)
    transformed = transformed.reshape(10000, 5, 5) # reshape it back to tiles
    tdata_transformed[:, :, :, i] = transformed # put it in the transformed array
    channel_scalers.append(mmx) # store the transform
...