【问题标题】:Most efficient way to apply linear transformations to each column of a numpy array将线性变换应用于 numpy 数组的每一列的最有效方法
【发布时间】:2020-04-24 08:27:03
【问题描述】:

我有一个随机的 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中的位置更改使用的间隔?

【问题讨论】:

    标签: python arrays numpy transform


    【解决方案1】:

    使用 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)
    

    【讨论】:

    【解决方案2】:

    遍历列,并将您的函数应用于每一行应该可以工作:

    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]])
    

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 2013-12-29
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多