Как эффективно вычесть значения из каждого столбца с NumPy - PullRequest
0 голосов
/ 28 марта 2019

У меня есть двумерный массив формы (50,50).Мне нужно вычесть значение из каждого столбца этого массива, пропустив первый), который рассчитывается на основе индекса столбца.Например, при использовании цикла for это будет выглядеть примерно так:

for idx in range(1, A[0, :].shape[0]):
    A[0, idx] -= idx * (...) # simple calculations with idx 

Теперь, конечно, это работает нормально, но очень медленно, и производительность критична для моего приложения.Я попытался вычислить значения, которые нужно вычесть, с помощью np.fromfunction (), а затем вычесть его из исходного массива, но результаты отличаются от результатов, полученных с помощью итеративного вычитания цикла for:

 func = lambda i, j: j * (...) #some simple calculations
 subtraction_matrix = np.fromfunction(np.vectorize(func), (1,50))

 A[0, 1:] -= subtraction_matrix

Что такоеЯ делаю не так?Или есть какой-то другой способ, который был бы лучше?Любая помощь приветствуется!

1 Ответ

0 голосов
/ 28 марта 2019

Все ваши фрагменты кода указывают, что вы хотите, чтобы вычитание происходило только в первой строке A (хотя вы явно не упомянули об этом).Итак, я продолжаю с этим пониманием.

Что касается использования from_function(), вы можете использовать subtraction_matrix, как показано ниже:

A[0,1:] -= subtraction_matrix[1:]

Проверка его(принимая форму (5,5) вместо (50,50)):

import numpy as np

A = np.arange(25).reshape(5,5)
print (A)

func = lambda j: j * 10 #some simple calculations
subtraction_matrix = np.fromfunction(np.vectorize(func), (5,), dtype=A.dtype)

A[0,1:] -= subtraction_matrix[1:]
print (A)

Вывод:

[[ 0  1  2  3  4]        # print(A), before subtraction
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

[[  0  -9 -18 -27 -36]   # print(A), after subtraction
 [  5   6   7   8   9]
 [ 10  11  12  13  14]
 [ 15  16  17  18  19]
 [ 20  21  22  23  24]]

Если вы хотите вычитаниечтобы происходить в всех строках A, вам просто нужно использовать строку A[:,1:] -= subtraction_matrix[1:] вместо строки A[0,1:] -= subtraction_matrix[1:]

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