Удалить среднее значение из матрицы numpy

У меня есть матрица N с матрицей A где данные организованы в виде столбцов-векторов, т.е. A[:,0] – первый вектор данных, A[:,1] – второй и т. Д. Я хотел знать, был ли более элегантный способ обнулить среднее из этих данных. В настоящее время я делаю это через цикл for :

 mean=A.mean(axis=1) for k in range(A.shape[1]): A[:,k]=A[:,k]-mean 

Так что numpy предоставляет функцию для этого? Или это можно сделать более эффективно по-другому?

3 Solutions collect form web for “Удалить среднее значение из матрицы numpy”

Как это обычно бывает, вы можете сделать это несколькими способами. Каждый из подходов ниже работает, добавляя измерение к mean вектору, делая его массивом размером 4 x 1, а затем вещание NumPy заботится обо всем остальном. Каждый подход создает представление о mean , а не глубокой копии. Первый подход (т. newaxis Использование newaxis ), скорее всего, предпочтительнее большинства, но другие методы включены для записи.

В дополнение к приведенным ниже подходам, см. Также ответ ovgolovin , в котором используется матрица NumPy, чтобы избежать необходимости изменения mean .

В приведенных ниже методах мы начинаем с следующего кода и массива примеров A

 import numpy as np A = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]]) mean = A.mean(axis=1) 

Использование numpy.newaxis

 >>> A - mean[:, np.newaxis] array([[-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.]]) 

Использование None

В документации указано, что вместо newaxis можно использовать newaxis . Это потому что

 >>> np.newaxis is None True 

Поэтому выполнение этой задачи выполняется.

 >>> A - mean[:, None] array([[-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.]]) 

Тем не менее, newaxis более newaxis и должен быть предпочтительным. Кроме того, можно сделать newaxis что newaxis является более перспективным доказательством. См. Также: Numpy: Должен ли я использовать newaxis или None?

Использование ndarray.reshape

 >>> A - mean.reshape((mean.shape[0]), 1) array([[-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.]]) 

Изменение ndarray.shape напрямую

Вы также можете изменить форму mean .

 >>> mean.shape = (mean.shape[0], 1) >>> A - mean array([[-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.]]) 

Вы также можете использовать matrix вместо array . Тогда вам не нужно будет изменять форму:

 >>> A = np.matrix([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]]) >>> m = A.mean(axis=1) >>> A - m matrix([[-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.]]) 

Да. pylab.demean :

 In [1]: X = scipy.rand(2,3) In [2]: X.mean(axis=1) Out[2]: array([ 0.42654669, 0.65216704]) In [3]: Y = pylab.demean(X, axis=1) In [4]: Y.mean(axis=1) Out[4]: array([ 1.85037171e-17, 0.00000000e+00]) 

Источник:

 In [5]: pylab.demean?? Type: function Base Class: <type 'function'> String Form: <function demean at 0x38492a8> Namespace: Interactive File: /usr/lib/pymodules/python2.7/matplotlib/mlab.py Definition: pylab.demean(x, axis=0) Source: def demean(x, axis=0): "Return x minus its mean along the specified axis" x = np.asarray(x) if axis == 0 or axis is None or x.ndim <= 1: return x - x.mean(axis) ind = [slice(None)] * x.ndim ind[axis] = np.newaxis return x - x.mean(axis)[ind] 
  • Как я могу маскировать элементы массива записей в Numpy?
  • Оберните срез вокруг краев двумерного массива в numpy
  • Эффективный способ преобразования массива записей numpy в список словарей
  • Внедрение «фильтра Kurtosis» с использованием scipys generic_filter
  • Как читать изображение из массива numpy в изображение PIL?
  • Как обновить окно imshow () matplotlib в интерактивном режиме?
  • перетасовать и перепутать
  • Быстро вычислить собственные векторы для каждого элемента массива в python
  • Python - лучший язык программирования в мире.