Сформируйте массив numpy из индексов и заполните нулями - PullRequest
1 голос
/ 20 февраля 2020

У меня есть массив Nympy a = np.array([483, 39, 18, 999, 20, 48]

У меня есть массив индексов indices = np.array([2, 3])

Я хотел бы иметь все индексы массива и заполнить остальные индексы с 0, поэтому я получаю в результате:

np.array([0, 0, 18, 999, 0, 0])

Спасибо за ваш ответ.

Ответы [ 3 ]

2 голосов
/ 20 февраля 2020

Создайте массив всех нулей и скопируйте значения с нужными индексами:

import numpy as np

a = np.array([483, 39, 18, 999, 20, 48])
indices = np.array([2, 3])

b = np.zeros_like(a)
b[indices] = a[indices]

# a = b     # if needed

print(a)
print(indices)
print(b)

Вывод:

[483  39  18 999  20  48]
[2 3]
[  0   0  18 999   0   0]

Надеюсь, что поможет!

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.1
NumPy:       1.18.1
----------------------------------------

РЕДАКТИРОВАТЬ: Еще лучше использовать np.setdiff1d:

import numpy as np

a = np.array([483, 39, 18, 999, 20, 48])
indices = np.array([2, 3])

print(a)
print(indices)

a[np.setdiff1d(np.arange(a.shape[0]), indices, True)] = 0

print(a)

Выход:

[483  39  18 999  20  48]
[2 3]
[  0   0  18 999   0   0]
0 голосов
/ 20 февраля 2020

А как насчет использования списка?

a = np.array([n if i in indices else 0 for i, n in enumerate(a)])

print(a) #array([  0,   0,  18, 999,   0,   0])
0 голосов
/ 20 февраля 2020

Вы можете создать функцию, которая использует входной массив и индексный массив для этого, как показано ниже:

import numpy as np

def remove_by_index(input_array, indexes):
    for i,_ in enumerate(input_array):
        if i not in indexes:
            input_array[i] = 0
    return input_array

input_array = np.array([483, 39, 18, 999, 20, 48])
indexes = np.array([2, 3])

new_out = remove_by_index(input_array, indexes)

expected_out = np.array([0, 0, 18, 999, 0, 0])

print(new_out == expected_out)  # to check if it's correct

Редактировать

Вы можете также используйте понимание функции внутри функции, что было бы лучше:

def remove_by_index(input_array, indexes):
    return [input_array[i] if (i in indexes) else 0 for i,_ in enumerate(input_array)]

Это , а не , как указано в комментариях, наиболее эффективный способ сделать это, выполняя итерацию на уровне Python вместо уровня C, но это работает, и для случайного использования это решит.

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