Новый многомерный массив, присваивающий значения из массива индексам второго массива - PullRequest
0 голосов
/ 04 октября 2019

Хотя я не чувствую, что это слишком сложно, я борюсь с тем, как даже искать похожие вопросы / ответы.

У меня есть два массива.

indices_array: [0, 1, 1, 0, 0, 1, 0]

value_array: [1, 2, 3, 4, 5, 6, 7]

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

Используя приведенные выше примеры массивов, это должно привести к:

[[1, 0],
 [0, 2],
 [0, 3],
 [4, 0],
 [5, 0],
 [0, 6],
 [7, 0]]

Я могу легко создать пустую версию нужного мне массива, используя: np.zeros((total_len, values_per_index))

Моя интуиция не срабатывает при попытке что-то вроде: target_array[indices_array] = value_array

Мне кажется, я понимаю, почемумой попытанный метод не удался, но как на самом деле это сделать, ускользает от меня. Есть ли простой способ сделать это? Python - далеко не мой лучший язык, и некоторые из хитростей иногда кажутся чересчур волшебными по своей природе.

Редактировать: я знаю, что цикл for справился бы с этим, но я действительно хочу лучше понять numpyи в идеале избегать итераций, когда это возможно, для обеспечения чистоты кода и читабельности.

Ответы [ 4 ]

2 голосов
/ 04 октября 2019

Вы можете сделать:

import numpy as np

indices = np.array([0, 1, 1, 0, 0, 1, 0])
values = np.array([1, 2, 3, 4, 5, 6, 7])

result = np.zeros((len(indices), 2))

result[np.arange(len(indices)), indices] = values

print(result)

Выход

[[1. 0.]
 [0. 2.]
 [0. 3.]
 [4. 0.]
 [5. 0.]
 [0. 6.]
 [7. 0.]]

См. индексирование в numpy.

1 голос
/ 04 октября 2019

Вы можете использовать умножение, как показано ниже

indices_array = np.array([0, 1, 1, 0, 0, 1, 0])
value_array = np.array([1, 2, 3, 4, 5, 6, 7])


## you can simply do this
value_array = np.c_[value_array * (indices_array==0), value_array * (indices_array==1)]
display(value_array)
0 голосов
/ 04 октября 2019

Вы можете просто использовать column_stack и умножать, используя numpy broadcast

i_arr = np.array([0, 1, 1, 0, 0, 1, 0])
v_arr = np.array([1, 2, 3, 4, 5, 6, 7])

np.column_stack((1-i_arr, i_arr)) * v_arr[:,None]

Out[61]:
array([[1, 0],
       [0, 2],
       [0, 3],
       [4, 0],
       [5, 0],
       [0, 6],
       [7, 0]])
0 голосов
/ 04 октября 2019

У вас это работает?

import numpy as np                                                                                                                                                                     

a = np.array([0, 1, 1, 0, 0, 1, 0])                                                                                                                                                    
b = np.array([1, 2, 3, 4, 5, 6, 7])                                                                                                                                                    

print(np.array([a*b,(1-a)*b]))

[[0 2 3 0 0 6 0]

[1 0 0 4 5 0 7]]

...