【发布时间】:2018-02-18 15:14:13
【问题描述】:
假设我们有一个用于创建 numpy 数组对象的 numpy 数组的函数:
randarr = lambda shape: np.random.randint(0, 10, shape)
get_numpy_array_obj = lambda shapes: \
np.array([randarr(shape) for shape in shapes])
还有数组的定义大小:
shapes = [(2, 3), (3, 4), (4, 2)]
因为数组的形状不一样,numpy把其他数组当成对象。
现在如果我们创建两个这样的数组
A = get_numpy_array_obj(shapes)
B = get_numpy_array_obj(shapes)
做简单的操作如+、-、**等都不是问题,例如:
C = A * B - (A + B)**2
当我想对这些数组(如 tanh、exp 等)应用 numpy 函数时,就会出现问题。
D = np.tanh(A)
这会返回给我以下错误:
AttributeError: 'numpy.ndarray' object has no attribute 'tanh'
我可以像这样将函数一个接一个地应用到每个数组上
D = np.array([np.tanh(a) for a in A])
我的想法是编写更少的代码并提高可读性。
np.vectorize(np.tanh)(A) 也无法正常工作。这将返回:
ValueError: setting an array element with a sequence.
还有其他可能的方法可以在 numpy 数组对象的数组上应用 numpy 函数吗?
【问题讨论】:
-
不是真的,我不这么认为。从 Numpy 的角度来看,没有“数组数组”这样的东西。它只是将其视为(可能)异构的 Python 对象数组,因此它不一定知道如何对它们进行矢量化操作。您可能会考虑不同的数据结构,例如稀疏矩阵或其他东西,具体取决于您的应用程序。否则,您可以在对数组的应用操作中逐个迭代数组——在这种情况下没有真正的缺点。
-
我需要这个专门用于机器学习(用于层之间的权重)。这种类型的操作被多次使用,也用于巨大的数组大小。除了我写的问题中的列表理解之外,我还能以某种方式获得更好的表现吗?
-
试试 np.frompyfunc
-
你的回答真的很有帮助!可以使用
np.frompyfunc(np.tanh, 1, 1)代替np.tanh。您能否详细回答这个问题或提供np.frompyfunc的链接和示例? (接受答案)