【问题标题】:numpy vertical function :'float' object is not subscriptablenumpy 垂直函数:'float' 对象不可下标
【发布时间】:2021-11-27 19:40:03
【问题描述】:

我有一个 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 设置变量的正确方法是什么?有朋友可以帮忙吗?

【问题讨论】:

  • 您应该检查函数中使用的mt 的值。当您向 ufunc 传递一个数组时,它将为数组中的每个值调用评估函数。对于您正在做的事情,尚不清楚您为什么使用frompyfunc 而不仅仅是制作常规函数(即调用getnpx(pval,1)
  • 谢谢你的回复,因为我的逻辑很复杂,比如np.cumprod我已经工作了1个月我必须使用frompyfunc
  • 如果您必须使用frompyfunc,那么您应该了解ufuncs,因为它会返回。第一句话告诉您它们“以逐个元素的方式运行”,这意味着它们不适用于您尝试做的事情,除非您可以传递将按您想要的方式广播的内容(比如:vgetnpx(pval,[[1], [0]])) 其中主函数的返回值就是mt+age
  • 您希望frompyfuncpval 数组做什么?
  • 非常感谢您提出@hpaulj 请检查此问题,您将知道stackoverflow.com/questions/68955129/…

标签: python numpy vectorization numpy-ndarray array-broadcasting


【解决方案1】:

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

In [97]: pval=np.array([[0., 0.,0., 0., 0.,0., 0., 0.],
    ...:               [0., 0., 0., 0., 0.,0., 0., 0.]])

在第一种情况下,您使用全局 pval,并且只使用 1 个 age 值。不用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,这样它会很高兴返回object dtype 结果。或者使用 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.]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多