Наиболее эффективный способ применения линейных преобразований к каждому столбцу массива numpy - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть случайный numpy массив

import numpy as np

a = np.random.randn(10000*5).reshape((10000,5))

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

def lintransform(interval,x): 
    return (interval[1]-interval[0])*x + interval[0]

Где interval является одним из пять отсортированных массивов длины 2 для преобразования столбцов a.

(например, listofintervals = [[0,3],[1,9],[0.5,3],[4,10],[1,2.7]])

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

Ответы [ 2 ]

3 голосов
/ 24 апреля 2020

Используя numpy векторизацию, вы можете сделать:

import numpy as np
a = np.random.randn(10000, 5)

intervals = np.array([[0,3],
                      [1,9],
                      [0.5,3],
                      [4,10],
                      [1,2.7]])

r = (intervals[:,1] - intervals[:,0]) * a + intervals[:,0]

Что занимает:

%timeit (intervals[:,1] - intervals[:,0]) * a + intervals[:,0]
131 µs ± 1.35 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
1 голос
/ 24 апреля 2020

Цикл по столбцам и применение вашей функции к каждой строке должно работать:

for col in range(a.shape[1]):
    a[col] = lintransform(listofintervals[col], a[col])

Вывод:

a
array([[-5.80231737, -3.1056331 , -1.3878622 ,  3.2891958 , -1.35495844],
       [-7.93085499, 18.46079707, 13.81923528, -3.18486045, -0.31541526],
       [ 1.53477244,  2.61705202, -2.14505552,  0.14751953,  4.70029497],
       ...,
       [ 1.13798389, -0.6765344 , -0.1364982 , -1.0443724 ,  0.06717867],
       [-1.78251012,  0.11171333,  1.28247762,  0.52285423,  0.16057854],
       [-0.59513499, -0.76866946, -0.37233491, -1.08463643, -0.45660967]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...