#python #python_3x #numpy
Нужно написать функцию, которая возвращает сумму значений массива по списку индексов элементов. Например: массив(2 5 7 3), список индексов(1 3), ответ(2+7=9). Не могу разобраться, как мне сделать суммирование по индексам. Остановился на этом: import numpy as np arr = np.array(input('Введите значения массива: ').split()).astype(int) indices = np.array(input('Введите индексы элементов в массиве: ').split()).astype(int) result = 0 for i in indices: result += arr[indices[i]] print(result)
Ответы
Ответ 1
Все просто: In [42]: a = np.array([2, 5, 7, 3]) In [43]: idx = np.array([1,3]) In [44]: a[idx] Out[44]: array([5, 3]) только индексирование в Numpy (как и в обычном Python) начинается с 0: In [45]: a[idx-1] Out[45]: array([2, 7]) In [46]: a[idx-1].sum() Out[46]: 9 In [47]: a[idx].sum() Out[47]: 8 UPDATE: как сделать, чтоб индексы вводить не в массив, а в список? In [48]: idx = [0,2] In [49]: a[idx].sum() Out[49]: 9 правда трюк с вычитанием числа от всех элементов списка уже не сработает: In [50]: idx-1 --------------------------------------------------------------------------- TypeError Traceback (most recent call last)in () ----> 1 idx-1 TypeError: unsupported operand type(s) for -: 'list' and 'int' можно так: In [52]: a[np.array(idx)-1].sum() Out[52]: 8 Почему в Numpy лучше пользоваться встроенными "vectorized ufuncs": In [62]: a = np.random.randint(10**4, size=(10**6), dtype=np.int32) In [63]: a.shape Out[63]: (1000000,) In [64]: idx = np.random.randint(10**6, size=(10**4)) In [65]: %timeit a[idx].sum() 50.9 µs ± 907 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) In [66]: %timeit sum(a[i] for i in idx) 3.78 ms ± 287 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) Ответ 2
Если доработать алгоритм в вопросе: import numpy as np arr = np.array('1 2 4 8'.split()).astype(int) indices = np.array('0 2'.split()).astype(int) result = 0 for i in indices: result += arr[i] # OR: result = sum(arr[i] for i in indices) print(result) Ошибка в том, что for i in indices уже возвращал значения, а не индексы. Поэтому у автора indices возвращал значения и внутри цикла у indices бралось значение по самому значение, которое было индексом.
Комментариев нет:
Отправить комментарий