np.object dtype 可以包含任何 Python 对象,包括函数。
例如:
import numpy as np
lmb = lambda: "help, I'm trapped in an array!"
arr = np.array([(max, lmb)], dtype=[('alpha', np.object), ('beta', np.object)])
arr = arr.view(np.recarray)
print(repr(arr))
# array([(<built-in function max>, <function <lambda> at 0x63992a8>)],
# dtype=[('alpha', 'O'), ('beta', 'O')]).view(numpy.recarray)
print(arr.alpha[0](1, 2))
# 2
print(arr.beta[0]())
# help, I'm trapped in an array!
在函数元组周围添加了一组额外的方括号,以强制数组是一维的,这允许您索引第一行以访问它包含的函数。
如果允许数组是 0 维的,访问函数会有点尴尬,但它仍然是可能的,正如 user2357112 在下面的 cmets 中指出的那样:
arr2 = np.array((max, lmb), dtype=[('alpha', np.object), ('beta', np.object)])
arr2 = arr2.view(np.recarray)
print(repr(arr2))
# array((<built-in function max>, <function <lambda> at 0x63995f0>),
# dtype=[('alpha', 'O'), ('beta', 'O')]).view(numpy.recarray)
print(repr(arr2['alpha']))
# array(<built-in function max>, dtype=object)
# we can't access the function without any indexing, because `arr2['alpha']`
# is still an ndarray containing a function, rather than a plain function,
# and arrays have no `.__call__()` method:
arr2.alpha(1, 2)
# ---------------------------------------------------------------------------
# TypeError Traceback (most recent call last)
# <ipython-input-100-dc1bd6446de4> in <module>()
# ----> 1 arr2['alpha'](1, 2)
# TypeError: 'numpy.ndarray' object is not callable
# it is possible to access the function by indexing with an empty tuple
print(arr2.alpha[()](1, 2))
# 2
我在此处修复了您的示例中的其他几个语法问题。
不过,我不得不问你为什么要这样做。一个简单的dict 似乎是一个更合适的数据结构。