NumPy垂直函数:'浮动'对象不可订阅

问题描述

我有一个麻木的阵列:

import numpy as np

pval=np.array([[0., 0.,0., 0., 0.,0., 0., 0.],
              [0., 0., 0., 0., 0.,0., 0., 0.]])

和矢量化函数:

def getnpx(age):
    return pval[0]+age
    
vgetnpx = np.frompyfunc(getnpx, 1, 1)

vgetnpx(1)

输出:

array([1., 1., 1., 1., 1., 1., 1., 1.])

但是,如果我想为pval设置一个变量:

def getnpx(mt,age):
    return mt[0]+age

vgetnpx = np.frompyfunc(getnpx, 2, 1)

vgetnpx(pval,1)

我收到错误:

TypeError: 'float' object is not subscriptable

为pval设置变量的正确方法是什么?任何朋友都可以帮助您吗?


解决方案

我不明白您为什么要尝试使用frompyfunc。用于将数组参数传递给仅接受标量输入的函数。

In [97]: pval=np.array([[0., 0.,0., 0., 0.,0., 0., 0.],
    ...:               [0., 0., 0., 0., 0.,0., 0., 0.]])
在第一种情况下,您使用全局pval,并且只使用1age值。无需frompyfunc

In [98]: pval[0]+1
Out[98]: array([1., 1., 1., 1., 1., 1., 1., 1.])

如果要将pval作为参数传递,只需执行以下操作:

In [99]: def foo(mt,age):
    ...:     return mt[0]+age
    ...: 
In [100]: foo(pval,1)
Out[100]: array([1., 1., 1., 1., 1., 1., 1., 1.])

您提供了指向我之前回答的问题的链接。这种情况的症结在于,您的函数返回了一个大小可能不同的数组。我展示了如何通过列表理解来使用它。我还展示了如何调整vectorize,以便它可以愉快地返回objectdtype结果。或者使用frompyfunc返回该对象。在所有这些情况下,函数参数都是标量,即单个数字。

如果您的目标是向pval的每一行添加不同的age,则只需执行以下操作:

In [102]: pval + np.array([[1],[2]])
Out[102]: 
array([[1., 1., 1., 1., 1., 1., 1., 1.],
       [2., 2., 2., 2., 2., 2., 2., 2.]])

相关文章