numpy矩阵行/列上的函数应用

发布于 2021-01-29 18:30:17

我正在使用Numpy将数据存储到矩阵中。从R背景开始,有一种极其简单的方法将函数应用于矩阵的行/列或两者。

python / numpy组合是否有类似的东西?编写自己的小实现不是问题,但是在我看来,我想出的大多数版本都将比现有的实现效率低得多/占用更多内存。

我想避免从numpy矩阵复制到局部变量等,这可能吗?

我尝试实现的功能主要是简单的比较(例如,某列中有多少个元素小于数字x,或者它们中有多少个绝对值大于y)。

关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    几乎所有的numpy函数都在整个数组上运行,并且/或者可以被告知在特定的轴(行或列)上运行。

    只要您可以根据作用在numpy数组或数组切片上的numpy函数来定义函数,您的函数将自动在整个数组,行或列上运行。

    询问如何实现特定功能以获得更具体的建议可能会更有用。


    Numpy提供np.vectorizenp.frompyfunc来将对数字进行操作的Python函数转换为对numpy数组进行操作的函数。

    例如,

    def myfunc(a,b):
        if (a>b): return a
        else: return b
    vecfunc = np.vectorize(myfunc)
    result=vecfunc([[1,2,3],[5,6,9]],[7,4,5])
    print(result)
    # [[7 4 5]
    #  [7 6 9]]
    

    (当第二个数组较大时,第一个数组的元素将替换为第二个数组的相应元素。)

    但是不要太兴奋;np.vectorize并且np.frompyfunc只是语法糖。它们实际上并没有使您的代码更快。如果您的基础Python函数一次仅对一个值进行操作,则一次np.vectorize将其馈入一个项,并且整个操作将非常缓慢(与使用numpy函数调用某些基础C或Fortran实现相比)


    要计算x小于数字的column元素个数y,可以使用如下表达式:

    (array['x']<y).sum()
    

    例如:

    import numpy as np
    array=np.arange(6).view([('x',np.int),('y',np.int)])
    print(array)
    # [(0, 1) (2, 3) (4, 5)]
    
    print(array['x'])
    # [0 2 4]
    
    print(array['x']<3)
    # [ True  True False]
    
    print((array['x']<3).sum())
    # 2
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看