gpt4 book ai didi

python - Numpy 中每一行的 `vectorize`

转载 作者:太空宇宙 更新时间:2023-11-03 11:47:03 25 4
gpt4 key购买 nike

假设我有一个 n x m 的矩阵,并想对其每个元素调用一个函数 fct。我可以这样做:

A = numpy.array(...)
vec_func = numpy.vectorize(fct)
A_out = vec_func(A)

这将严格地将函数应用于每个矩阵元素,fct 将是一个函数:

def fct(a_ij):
# do something with matrix element a(i, j)

现在我想要相同的,但是对于矩阵的每一行:

def fct(row_i):
# do something with matrix row(i)

有没有办法用 numpy.vectorize 或类似的方法来做到这一点?

最佳答案

编辑:它看起来像 np.apply_along_axis 做你想做的。例如:

import numpy as np

def f(x):
return x * x.sum()

X = np.arange(12).reshape(2, 2, 3)
np.apply_along_axis(f, -1, X)
# array([[[ 0, 3, 6],
# [ 36, 48, 60]],
#
# [[126, 147, 168],
# [270, 300, 330]]])

下面我的原始回复中关于性能的说明仍然适用。


原始回复:

这没有内置的,但 Python 使您可以直接自己定义这样的上下文管理器。例如:

import numpy as np
from contextlib import wraps

def row_vectorize(f):
@wraps(f)
def wrapped_f(X):
X = np.asarray(X)
rows = X.reshape(-1, X.shape[-1])
return np.reshape([f(row) for row in rows],
X.shape[:-1] + (-1,))
return wrapped_f


@row_vectorize
def func(row):
return row * row.sum()

现在您可以在任何非零维度的数组上使用它:

>>> X_1D = np.arange(3)
>>> func(X_1D)
array([0, 3, 6])

>>> X_2D = np.arange(6).reshape(2, 3)
>>> func(X_2D)
array([[ 0, 3, 6],
[36, 48, 60]])

>>> X_3D = np.arange(12).reshape((2, 2, 3))
>>> func(X_3D)
array([[[ 0, 3, 6],
[ 36, 48, 60]],

[[126, 147, 168],
[270, 300, 330]]])

在性能方面,np.vectorize 正在做一些非常相似的事情。

如果您需要更快地循环应用跨数组的自定义函数,您通常可以根据 numpy 元素操作和聚合操作来构造您的方法;例如,这个函数完成与上面的行向量化函数相同的事情,但在大输入时会快得多:

def func2(X):
return X * X.sum(-1, keepdims=True)

如果你有一个更复杂的操作,你想跨数组的行应用并且循环的性能是一个瓶颈,最好的选择可能是使用 numbacython .

关于python - Numpy 中每一行的 `vectorize`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37074479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com