当前位置: 首页 > 面试题库 >

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

秦新立
2023-03-14
问题内容

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

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

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

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


问题答案:

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

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

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

Numpy提供np.vectorize和np.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


 类似资料:
  • 问题内容: 我希望能够遍历矩阵以将函数应用于每一行。如何针对Numpy矩阵执行此操作? 问题答案: 使用。假设您的矩阵是2D,则可以这样使用:

  • 问题内容: 假设我有一个由列表列表组成的矩阵,如下所示: 同样,假设我有一个具有相同结构的numpy矩阵,称为: 使用numpy,我可以得到这个矩阵的子矩阵,如下所示: 我可以像这样在纯Python中复制numpy矩阵切片: 这不是世界上最容易阅读的东西,也不是最有效的:-) 问题:是否有更简单的方法(在纯Python中)将任意矩阵切片为子矩阵? 问题答案: 您还可以通过定义以下子类来模仿NumP

  • 问题内容: 我有以下内容: 如何在XYZ_2上执行与在XYZ_2上相同的操作?我会以某种方式首先重塑数组吗? 问题答案: 您似乎正在尝试的最后一个轴 与最后一个 。因此,您可以像这样使用- 相关帖子了解。 为了完整起见,在交换的最后两个轴后,我们当然也可以使用,例如- 这将不如一个高效。 运行时测试- 一般而言,涉及张量时,效率要高得多。由于的轴只有一个,因此我们可以通过重整,使用,获取结果并将其

  • 主要内容:逐元素矩阵乘法,矩阵乘积运算,矩阵点积矩阵乘法是将两个矩阵作为输入值,并将 A 矩阵的行与 B 矩阵的列对应位置相乘再相加,从而生成一个新矩阵,如下图所示: 注意:必须确保第一个矩阵中的行数等于第二个矩阵中的列数,否则不能进行矩阵乘法运算。 图1:矩阵乘法 矩阵乘法运算被称为向量化操作,向量化的主要目的是减少使用的 for 循环次数或者根本不使用。这样做的目的是为了加速程序的计算。 下面介绍 NumPy 提供的三种矩阵乘法,从而进一步

  • 主要内容:matlib.empty(),numpy.matlib.zeros(),numpy.matlib.ones(),numpy.matlib.eye(),numpy.matlib.identity(),numpy.matlib.rand()NumPy 提供了一个 矩阵库模块 ,该模块中的函数返回的是一个 matrix 对象,而非 ndarray 对象。矩阵由 m 行 n 列(m*n)元素排列而成,矩阵中的元素可以是数字、符号或数学公式等。 matlib.empty() matlib.emp

  • 中的值匹配功能非常有用。但据我理解,它不足以支持二维或高维输入。 例如,假设和是相同列数的矩阵,我想将的行与的行进行匹配。“R”函数调用不这样做。列表的输入也存在同样的不足。 我已经实现了我自己的版本,名为(附在下面),但我想知道您对此任务的解决方案是什么。