我numpy.array的列包含不同的数据类型,列也应该有不同的函数应用于它们.我也有一个数组中的函数.
让我们说:
a = array([[ 1, 2.0, "three"],
[ 4, 5.0, "six" ]], dtype=object)
functions_arr = array([act_on_int, act_on_float, act_on_str])
Run Code Online (Sandbox Code Playgroud)
我当然可以想办法通过划分事物来做到这一点,但对我来说最自然的一件事就是将其视为与广播的元素乘法,以及作为运算符的函数.所以我想做点什么
functions_arr*a
Run Code Online (Sandbox Code Playgroud)
并获得的效果
array([[act_on_int(1), act_on_float(2.0), act_on_str("three")],
[act_on_int(4), act_on_float(5.0), act_on_str("six") ]])
Run Code Online (Sandbox Code Playgroud)
你知道如何通过这些方式实现某些目标吗?
编辑:我改变了问题中数组的定义,dtype=[object]因为人们指出这对于数组按照我的意图存储类型很重要.
感谢您的回答和评论!我已经接受了发送者的回答,觉得这与我的想法非常接近.
由于对于我如何将操作视为乘法似乎存在一些混淆,让我用另一个例子来澄清:
你很清楚,这样的操作如下:
v = array([1,2,3])
u = array([[5,7,11],
[13,17,19]])
v*u
Run Code Online (Sandbox Code Playgroud)
将广播v的行u和收益率
array([[ 1*5, 2*7, 3*11],
[1*13, 2*17, 3*19]])
Run Code Online (Sandbox Code Playgroud)
即
array([[ 5, 14, 33],
[13, 34, 57]])
Run Code Online (Sandbox Code Playgroud)
如果我们现在v用例如我们将拥有的del运算符替换(以下实际上不是在运行python代码 :)
V = array([(d/dx),(d/dy),(d/dz)])
u = array([[5,7,11],
[13,17,19]])
V*u
Run Code Online (Sandbox Code Playgroud)
屈服(精神上)
array([[(d/dx)5, (d/dy)7, (d/dz)11]],
[(d/dx)13,(d/dy)17,(d/dz)19]])
Run Code Online (Sandbox Code Playgroud)
我承认服用了一堆常数的衍生不会是最有趣的操作,可以随意更换u,在一些象征性的数学表达式x,y和z.无论如何,我希望这至少可以使我的推理和标题中的"(使用python函数作为运算符?)"更清楚.
正如 Sven Marnach 提醒我的那样,您创建的数组可能是 Python 对象的数组。对它们的任何操作都可能比纯numpy操作慢得多。但是,您可以很容易地完成您所要求的操作,只要您实际上并不期望这会非常快!它与AFoglia的建议并没有太大不同,但它更接近您所要求的:
>>> a = numpy.array([[ 1, 2.0, "three"],
... [ 4, 5.0, "six" ]], dtype=object)
>>> funcs = [lambda x: x + 10, lambda x: x / 2, lambda x: x + '!']
>>> apply_vectorized = numpy.vectorize(lambda f, x: f(x), otypes=[object])
>>> apply_vectorized(funcs, a)
array([[11, 1.0, three!],
[14, 2.5, six!]], dtype=object)
Run Code Online (Sandbox Code Playgroud)
在这里也呼应 AFoglia,你很有可能最好使用记录数组——这允许你按照你喜欢的方式划分数组,并使用 numpy ufuncs以更自然的方式使用它——这比比 Python 函数更快,通常:
rec.array([(1, 2.0, 'three'), (4, 5.0, 'six')],
dtype=[('int', '<i8'), ('float', '<f8'), ('str', '|S10')])
>>> a['int']
array([1, 4])
>>> a['float']
array([ 2., 5.])
>>> a['str']
rec.array(['three', 'six'],
dtype='|S10')
>>> a['int'] += 10
>>> a['int']
array([11, 14])
Run Code Online (Sandbox Code Playgroud)