Какой эффективный способ заполнить 3D-массив на основе 2-мерного массива? - PullRequest
1 голос
/ 24 сентября 2019

Предположим, у меня есть 2d массив.

a = np.array([[0,2,3],[4,2,1]])

Размерность number_of_instances * 3, где значения в массиве 2d представляют индекс строки в pandas dataframe.

У меня есть dataframe:

df = pd.DataFrame(np.array([[10, 10, 10, 10], [11, 11, 11, 11], [12, 12, 12, 12], [13, 13, 13, 13], [14, 14, 14, 14]]), columns = list('ABCD'))

Out[23]: 
   A   B   C   D
0  10  10  10  10
1  11  11  11  11
2  12  12  12  12
3  13  13  13  13
4  14  14  14  14

Теперь у меня нулевой трехмерный массив, я пытаюсь заполнить трехмерный массив значениями в pandas dataframe.

b = np.empty(2,3,4)

Размерность number_of_instances * 3 * number_of_features, где number_of_featuresизвлекается из pandas dataframe с помощью соответствующего индекса строки в массиве 2d.

В идеале, я ожидал бы, что b выглядит следующим образом:

Out[24]:
array([[[10, 10, 10, 10],
        [12, 12, 12, 12],
        [13, 13, 13, 13]],
       [[14, 14, 14, 14],
        [12, 12, 12, 12],
        [11, 11, 11, 11]]])

Каков наиболее эффективный способ заполнения этого трехмерного массива?

Ответы [ 3 ]

2 голосов
/ 24 сентября 2019

Похоже, вам просто нужно индексировать

df.to_numpy()[a]

array([[[10, 10, 10, 10],
        [12, 12, 12, 12],
        [13, 13, 13, 13]],

       [[14, 14, 14, 14],
        [12, 12, 12, 12],
        [11, 11, 11, 11]]])
1 голос
/ 24 сентября 2019

Как насчет:

df.loc[a.ravel()].values.reshape((2,3,4))

Вывод:

array([[[10, 10, 10, 10],
        [12, 12, 12, 12],
        [13, 13, 13, 13]],

       [[14, 14, 14, 14],
        [12, 12, 12, 12],
        [11, 11, 11, 11]]])
0 голосов
/ 24 сентября 2019

То, что вы хотите, называется расширенной индексацией в официальной документации numpy.

Например, для вашего рабочего примера вы должны сделать следующее.

Сначала получите доступ к массиву numpy, соответствующемузначения кадра данных, вызывая df.values.Затем просто выполните:

df.values[[[0,1,3],[4,2,1]],:]

И все готово.

Приведенная выше индексация передает список из двух объектов в массив.Первый [[0,1,3], [4,2,1]], второй:.Первый предназначен для индексации 1 оси (строки), второй - 2 оси (столбцы).

Символ: просто возвращает все столбцы.

Теперь для строк вы имеетесписок из двух списков: [[0,1,3], [4,2,1]].Эта конструкция вернет два массива, так же, как вы хотите.Первый массив будет иметь строки 0, 1 и 3, а второй - 4, 2 и 1.

Numpy является мощным.Вы можете сделать многое, просто используя возможности индексации.

Редактировать: обратите внимание, что у вас уже есть список [[0,1,3], [4,2,1]] в переменной a.Так что df.values ​​[a] сделает это, как уже упоминалось.Это потому, что в этом случае аргумент column: является необязательным.Но полезно увидеть полную запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...