Python / Numpy - Как преобразовать этот (2,7,4) ndarray в (7,8) ndarray без конкатенации? - PullRequest
0 голосов
/ 05 мая 2020

В настоящее время я использую np.concatenate для преобразования (n_columns, n_rows, n_positions) ndarray в (n_rows, n_columns * n_positions) ndarray.

Потому что np.concatenate копирует первым, а поскольку данные являются "смежными", мне интересно, нет ли более быстрого способа с помощью reshape получить массив, который я ищу?

Но в любом порядке C, F или A я использую с reshape , Я не могу получить требуемое выравнивание.

Я использую эти тестовые данные.

import pandas as pd
import numpy as np
from random import seed, randint

# Data

n_rows = 4
start = '2020-01-01 00:00+00:00'
end = '2020-01-01 12:00+00:00'

pr2h = pd.period_range(start=start, end=end, freq='2h')
seed(1)
values1 = [randint(0,10) for ts in pr2h]
values2 = [randint(20,30) for ts in pr2h]
df = pd.DataFrame({'Values1' : values1, 'Values2': values2}, index=pr2h)

# Processing

array = np.concatenate((np.full((n_rows-1,len(df.columns)), np.nan), df), axis=0)
array = array.T
shape = array.shape[:-1] + (array.shape[-1] - n_rows + 1, n_rows)

strides = array.strides + (array.strides[-1],)
array = np.lib.stride_tricks.as_strided(array, shape=shape, strides=strides)

transposed = np.concatenate(array, axis=1)     # -> the line of code I would like to change

Итак, из-за обработки с помощью strides я получаю array как показано ниже.

array([[[nan, nan, nan,  2.],
        [nan, nan,  2.,  9.],
        [nan,  2.,  9.,  1.],
        [ 2.,  9.,  1.,  4.],
        [ 9.,  1.,  4.,  1.],
        [ 1.,  4.,  1.,  7.],
        [ 4.,  1.,  7.,  7.]],

       [[nan, nan, nan, 27.],
        [nan, nan, 27., 30.],
        [nan, 27., 30., 26.],
        [27., 30., 26., 23.],
        [30., 26., 23., 21.],
        [26., 23., 21., 27.],
        [23., 21., 27., 20.]]])

Благодаря np.concatenate(array, axis=1) я получил форму и порядок значений, которые искал, в transposed.

array([[nan, nan, nan,  2., nan, nan, nan, 27.],
       [nan, nan,  2.,  9., nan, nan, 27., 30.],
       [nan,  2.,  9.,  1., nan, 27., 30., 26.],
       [ 2.,  9.,  1.,  4., 27., 30., 26., 23.],
       [ 9.,  1.,  4.,  1., 30., 26., 23., 21.],
       [ 1.,  4.,  1.,  7., 26., 23., 21., 27.],
       [ 4.,  1.,  7.,  7., 23., 21., 27., 20.]])

Есть ли способ получить та же форма и порядок значений без создания копии массива?

Заранее благодарю вас за любую помощь. Бест,

1 Ответ

1 голос
/ 05 мая 2020

Попробуйте следующее:

np.reshape(np.transpose(array,(1,0,2)),(7,8))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...