Заполните значения в массив, заданный массив индексов и массив значений в Numpy - PullRequest
1 голос
/ 14 апреля 2020

У меня есть массив indexes, который для каждой строки содержит столбцы, которые должны быть заполнены. Например:

[array([[    2, 14098,  6824, 24207,  1215],
   [   51,  1277,  3197,  1052,  4076],......

И у меня есть еще один массив values, содержащий значения, которые должны быть заполнены в этих позициях. Например:

array([[1, 7, 75, 82, 11],
       [11, 5, 8, 82, 811],...

Это означает, что для строки 0 столбец 2 должен быть заполнен значением '1', столбец 14098 должен быть заполнен значением '7' ... для строки 1, столбец 51 должен должно быть заполнено значением '11', столбец 1277 должен быть заполнен значением '5' ...

И третьим массивом a = np.zeros((100000, 100000)), который является массивом, который должен быть заполнен с учетом двух предыдущих массивов.

Я сейчас использую вложенный l oop, чтобы сделать это, но я почти уверен, что есть лучший способ сделать это:

for row_idx in range(indexes.shape[0]):
    for col_idx in range(indexes.shape[1]):
        column = indexes[row_idx][col_idx]
        a[row_idx][indexes[row_idx][col_idx]] = values[row_idx][col_idx]

Как я могу заполнить массив, используя стиль python / numpy (необычное индексирование, трансляция ...)? Какой самый эффективный способ памяти это сделать, поскольку у меня ограничен оперативной памяти?

Спасибо за вашу помощь заранее!

1 Ответ

0 голосов
/ 14 апреля 2020

Это можно сделать с помощью np.put_along_axis

Поместить значения в целевой массив путем сопоставления 1d-индекса и срезов данных. Это перебирает соответствующие 1-мерные срезы, ориентированные вдоль указанного ось в индексе и массивах данных, и использует первое, чтобы поместить значения во второе. Эти срезы могут быть разной длины.

См. Это для примера, взятого из здесь

In [50]: df
Out[50]: 
   datetime1  datetime2  datetime3  datetime4
1          5          6          5          5
2          7          2          3          5
3          4          2          3          2
4          6          4          4          7
5          7          3          8          9

In [51]: index_arr = np.array([3, 2, 0 ,1 ,2])

In [52]: replace_arr = np.array([14, 12, 23, 17 ,15])

In [53]: np.put_along_axis(df.to_numpy(),index_arr[:,None],replace_arr[:,None],axis=1)

In [54]: df
Out[54]: 
   datetime1  datetime2  datetime3  datetime4
1          5          6          5         14
2          7          2         12          5
3         23          2          3          2
4          6         17          4          7
5          7          3         15          9

Как вы можете видеть, например, значение df[0][3] был изменен с 5 на 14, и применение этой же логики c будет хорошо работать для вашей проблемы.

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