将线性变换应用于 numpy 数组的每一列的最有效方法
Most efficient way to apply linear transformations to each column of a numpy array
我有一个随机的 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
中的位置更改使用的间隔的最有效方法是什么?
遍历各列,并将您的函数应用于每一行应该可行:
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]])
使用 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)
我有一个随机的 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
中的位置更改使用的间隔的最有效方法是什么?
遍历各列,并将您的函数应用于每一行应该可行:
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]])
使用 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)