问题
我有一个由
arr
定义的ndarray
,它是每个维度长度为m
的n
-维立方体。我想通过沿着维度
n=0
切片并将每个n-1
-dim切片作为函数的输入来激活函数func
。
这似乎适用于map()
,但我找不到合适的numpy
变体。 np.vectorise
似乎将n-1
-张量拆分成单个标量条目。 apply_along_axis
或apply_over_axes
也不合适。
我的问题是我需要传递任意函数作为输入,因此我不认为使用einsum
是可行的解决方案。
问题
- 您知道使用
np.asarray(map(func, arr))
的最佳numpy
替代方案吗?
例子
我通过以下方式将示例数组arr
定义为4-dim cube
(或4-tensor):
m, n = 3, 4
arr = np.arange(m**n).reshape((m,)*n)
I define an example function f
,
def f(x):
"""makes it obvious how the np.ndarray is being passed into the function"""
try: # perform an op using x[0,0,0] which is expected to exist
i = x[0,0,0]
except:
print '\nno element x[0,0,0] in x: \n{}'.format(x)
return np.nan
return x-x+i
这个函数的预期结果
res
将保持相同的形状,但需要满足以下条件:print all([(res[i] == i*m**(n-1)).all() for i in range(m)])
这适用于默认的map()
函数,
res = np.asarray(map(f, a))
print all([(res[i] == i*m**(n-1)).all() for i in range(m)])
True
我期望 np.vectorize
与 map()
的工作方式相同,但它在标量条目中运行:
res = np.vectorize(f)(a)
no element x[0,0,0] in x:
0
...