Как преобразовать массив 3-D Numpy в Pandas Dataframe? - PullRequest
2 голосов
/ 01 апреля 2020

Проблема : у меня 3-D Numpy Массив:

X

X.shape: (1797, 2, 500)

z=X[..., -1]
print(len(z))
print(z.shape)
count = 0
for bot in z:
    print(bot)
    count+=1
    if count == 3: break

Выше кода выдает следующий вывод:

1797
(1797, 2)
[23.293915 36.37388 ]
[21.594519 32.874397]
[27.29872  26.798382]

Итак, есть 1797 точек данных - каждая с координатами X и Y, и есть 500 итераций этих 1797 точек.

Я хочу DataFrame такой, что:

Index Column       |  X-coordinate  |  Y-coordinate
0                  |  X[0][0][0]    |  X[0][1][0]
0                  |  X[1][0][0]    |  X[1][1][0]
0                  |  X[2][0][0]    |  X[2][1][0]
('0') 1797 times
1                  |  X[0][0][1]    |  X[0][1][1]
1                  |  X[1][0][1]    |  X[1][1][1]
1                  |  X[2][0][1]    |  X[2][1][1]
('1' 1797 times)
.
.
.
and so on
till 500

Я пробовал методы, упомянутые здесь, но numpy / pandas действительно ускользает от меня:

  1. Как преобразовать 3D-массив в фрейм данных
  2. Как преобразовать трехмерные массивы в фрейм данных в python
  3. Преобразовать массив numpy в pandas фрейм данных
  4. простой многомерный numpy метод ndarray to pandas dataframe?
  5. numpy rollaxis - как именно это работает?

Пожалуйста, помогите мне. Надеюсь, я придерживаюсь дисциплины, задающей вопросы.

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Вот решение с примерами данных:

a,b,c = X.shape
# in your case
# a,b,c = 1797, 500

pd.DataFrame(X.transpose(1,2,0).reshape(2,-1).T,
             index=np.repeat(np.arange(c),a),
             columns=['X_coord','Y_coord'] 
            )

Вывод:

   X_coord  Y_coord
0        0        3
0        6        9
0       12       15
0       18       21
1        1        4
1        7       10
1       13       16
1       19       22
2        2        5
2        8       11
2       14       17
2       20       23
0 голосов
/ 01 апреля 2020

Попробуйте так:

index = np.concatenate([np.repeat([i], 1797) for i in range(500)])
df = pd.DataFrame(index=index)
df['X-coordinate'] = X[:, 0, :].T.reshape((-1))
df['Y-coordinate'] = X[:, 1, :].T.reshape((-1))
...