Numpy:将一组函数应用于相同长度的2d数组值,就像在元素中相乘一样?(使用python函数作为运算符?)

mir*_*ari 7 python numpy

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,yz.无论如何,我希望这至少可以使我的推理和标题中的"(使用python函数作为运算符?)"更清楚.

sen*_*rle 4

正如 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)