Объединение массива numpy

У меня есть массив numpy, который содержит данные временных рядов. Я хочу, чтобы этот массив был равен равным разделам заданной длины (отлично удалить последний раздел, если он не является одинаковым размером), а затем вычислить среднее значение для каждого из этих ящиков.

Я подозреваю, что для этого есть функция numpy, scipy или pandas.

Пример:

data = [4,2,5,6,7,5,4,3,5,7]

для размера ячейки 2:

bin_data = [(4,2),(5,6),(7,5),(4,3),(5,7)]
bin_data_mean = [3,5.5,6,3.5,6]

для размера ячейки 3:

bin_data = [(4,2,5),(6,7,5),(4,3,5)]
bin_data_mean = [7.67,6,4]

Ответ 1

Просто используйте reshape, а затем mean(axis=1).

В качестве простейшего возможного примера:

import numpy as np

data = np.array([4,2,5,6,7,5,4,3,5,7])

print data.reshape(-1, 2).mean(axis=1)

В более общем плане нам нужно сделать что-то подобное, чтобы удалить последний бит, если он не является даже кратным:

import numpy as np

width=3
data = np.array([4,2,5,6,7,5,4,3,5,7])

result = data[:(data.size // width) * width].reshape(-1, width).mean(axis=1)

print result

Ответ 2

Поскольку у вас уже есть массив numpy, чтобы избежать циклов, вы можете использовать reshape и считать новое измерение бином:

In [33]: data.reshape(2, -1)
Out[33]: 
array([[4, 2, 5, 6, 7],
       [5, 4, 3, 5, 7]])

In [34]: data.reshape(2, -1).mean(0)
Out[34]: array([ 4.5,  3. ,  4. ,  5.5,  7. ])

На самом деле это будет работать, только если размер data делится на n. Я отредактирую исправление.

Похоже, у Джо Кингтона есть ответ, который обрабатывает это.

Ответ 3

Попробуйте это, используя стандартный Python (NumPy для этого не требуется). Предполагая, что Python 2.x используется:

data = [ 4, 2, 5, 6, 7, 5, 4, 3, 5, 7 ]

# example: for n == 2
n=2
partitions = [data[i:i+n] for i in xrange(0, len(data), n)]
partitions = partitions if len(partitions[-1]) == n else partitions[:-1]

# the above produces a list of lists
partitions
=> [[4, 2], [5, 6], [7, 5], [4, 3], [5, 7]]

# now the mean
[sum(x)/float(n) for x in partitions]
=> [3.0, 5.5, 6.0, 3.5, 6.0]

Ответ 4

Я просто написал функцию, чтобы применить ее ко всем размерам или размеру массива.

  • данные - ваш массив
  • ось - это ось, в которой вы хотите
  • binstep - количество точек между каждым бункером (разрешить перекрывающиеся ячейки)
  • binsize - размер каждого бункера
  • func - это функция, которую вы хотите применить к bin (np.max для maxpooling, np.mean для среднего...)

    def binArray(data, axis, binstep, binsize, func=np.nanmean):
        data = np.array(data)
        dims = np.array(data.shape)
        argdims = np.arange(data.ndim)
        argdims[0], argdims[axis]= argdims[axis], argdims[0]
        data = data.transpose(argdims)
        data = [func(np.take(data,np.arange(int(i*binstep),int(i*binstep+binsize)),0),0) for i in np.arange(dims[axis]//binstep)]
        data = np.array(data).transpose(argdims)
        return data
    

В вашем случае это будет:

data = [4,2,5,6,7,5,4,3,5,7]
bin_data_mean = binArray(data, 0, 2, 2, np.mean)

или для размера корзины 3:

bin_data_mean = binArray(data, 0, 3, 3, np.mean)