Python: Центрирование объектов в массиве Numpy - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь нормализовать некоторые значения в массиве Numpy со следующей формой:

import numpy as np
X = np.random.rand(100, 20, 3)

Эти данные говорят, что для каждого из 20 наблюдений существует 100 временных отметок, где каждое наблюдение имеет 3 размерных атрибута(х, у, г).Я хочу нормализовать размерные атрибуты x, y, z следующим образом.Для каждого измерения я хочу вычесть мин, а затем разделить на результирующий максимум («центрировать» значения измерения).

Я попытался сделать это следующим образом:

# center all features
for i in range(3):
  X[:][:][i] -= np.min(X[:][:][i])
  X[:][:][i] /= np.max(X[:][:][i])

Однако это не приводит к изменению всех значений измерения ith.

Как я могу центрировать свои объекты таким образом?Будем весьма благодарны за любую помощь, которую могут предложить другие!

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

X[:] - это синтаксис Python, который в основном копирует каждый элемент списка.Итак, вы дважды копируете матрицу, а затем пытаетесь проиндексировать i.Вам нужно X[:, :, i].См. индексирование numpy для получения дополнительной информации о многомерной индексации массивов.

0 голосов
/ 16 октября 2018
X -= np.amin(X, axis=(0, 1))
X /= np.amax(X, axis=(0, 1))

ПРИМЕЧАНИЕ. Согласно документации numpy.amin() (аналогично amax()):

Оси или оси, по которым следует работать.По умолчанию используется плоский ввод.Если это кортеж целых чисел, минимум выбирается по нескольким осям вместо для одной оси или для всех осей, как раньше .

Byуказав axis=(0, 1), я прошу numpy.amin() найти минимум, просматривая все строки и столбцы для каждого элемента "глубина" (3-я ось).


Пошаговая иллюстрация:

In [1]: import numpy as np
   ...: np.random.seed(0)
   ...: X = np.random.rand(2, 4, 3)
   ...: print("\nOriginal X:\n%s" % X)
   ...: xmin = np.amin(X, axis=(0, 1))
   ...: print("\nxmin = %s" % xmin)
   ...: X -= xmin
   ...: print("\nSubtracted X:\n%s" % X)
   ...: xmax = np.amax(X, axis=(0, 1))
   ...: X /= xmax
   ...: print("\nDivided X:\n%s" % X)
   ...: 
   ...: 

Original X:
[[[0.5488135  0.71518937 0.60276338]
  [0.54488318 0.4236548  0.64589411]
  [0.43758721 0.891773   0.96366276]
  [0.38344152 0.79172504 0.52889492]]

 [[0.56804456 0.92559664 0.07103606]
  [0.0871293  0.0202184  0.83261985]
  [0.77815675 0.87001215 0.97861834]
  [0.79915856 0.46147936 0.78052918]]]

xmin = [0.0871293  0.0202184  0.07103606]

Subtracted X:
[[[0.4616842  0.69497097 0.53172732]
  [0.45775388 0.4034364  0.57485805]
  [0.35045791 0.8715546  0.8926267 ]
  [0.29631222 0.77150664 0.45785886]]

 [[0.48091526 0.90537824 0.        ]
  [0.         0.         0.76158379]
  [0.69102745 0.84979375 0.90758228]
  [0.71202926 0.44126096 0.70949312]]]

xmax = [0.71202926 0.90537824 0.90758228]

Divided X:
[[[0.64840622 0.76760291 0.5858723 ]
  [0.64288633 0.44559984 0.63339497]
  [0.49219594 0.96264143 0.98352151]
  [0.41615174 0.85213738 0.50448193]]

 [[0.67541502 1.         0.        ]
  [0.         0.         0.8391347 ]
  [0.97050428 0.93860633 1.        ]
  [1.         0.48737748 0.78173972]]]
...