gpt4 book ai didi

python - np.array 中的广播函数调用

转载 作者:行者123 更新时间:2023-12-03 18:39:13 32 4
gpt4 key购买 nike

我正在尝试创建一个填充有对象的 NumPy 数组,我想知道是否有一种方法可以将每个对象广播到整个数组以执行某些操作。

代码:

class player:
def __init__(self,num = 5):
self.num = num

def printnum():
print(self.num)
...

objs = np.array([player(5),player(6)],dtype=Object)
objs.printnum()

就目前而言,这会返回错误。我尝试将 dtype 更改为:按照手册的 _object ,但似乎没有任何效果。

最佳答案

numpy 对象数组不继承该对象的方法。 ndarray方法通常作用于整个数组

这也不适用于内置类型,例如:

In [122]: import numpy as np

In [123]: n = 4.0

In [124]: a = np.arange(n)

In [125]: n.is_integer()
Out[125]: True

In [126]: a.is_integer()
---------------------------------------------------------------------------
AttributeError: 'numpy.ndarray' object has no attribute 'is_integer'

Numpy 广播是使用元素操作符完成的,例如加法:
In [127]: n
Out[127]: 4.0

In [128]: a
Out[128]: array([ 0., 1., 2., 3.])

In [129]: n + a
Out[129]: array([ 4., 5., 6., 7.])

如果你想基本上打电话 print在数组中的所有元素上,您可以简单地重新定义 .__repr__()print 调用的方法.我要提醒您的是,您将因覆盖该方法而丢失信息。
In [148]: class player:
.....: def __init__(self, num=5):
.....: self.num = num
.....: def __repr__(self):
.....: return str(self.num)
.....:

In [149]: objs = np.array([player(5), player(6)])

In [150]: objs
Out[150]: array([5, 6], dtype=object)

In [151]: print objs
[5 6]

虽然看起来像,但这和 np.array([5,6])不一样尽管:
In [152]: objs * 3
----------------------
TypeError: unsupported operand type(s) for *: 'instance' and 'int'

在那里你可以看到覆盖 __repr__ 的缺点.

更简单的方法是使用您当前的 printnum()方法,但在循环中调用它:
In [164]: class player:
.....: def __init__(self, num=5):
.....: self.num = num
.....: def printnum(self):
.....: print(self.num)
.....:

In [165]: for p in objs:
.....: p.printnum()
.....:
5
6

或者,也许定义您的方法以返回一个字符串而不是打印一个字符串,然后进行列表理解:
In [169]: class player:
.....: def __init__(self, num=5):
.....: self.num = num
.....: def printnum(self):
.....: return str(self.num)
.....:

In [170]: objs = np.array([player(5), player(6)])

In [171]: [p.printnum() for p in objs]
Out[171]: ['5', '6']

关于python - np.array 中的广播函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15801707/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com