情况
我有一些对象,它们具有由numpy数组表示的属性:
>> obj = numpy.array([1, 2, 3])
其中1
、2
、3
是属性的值。
我即将编写一些方法,这些方法应该能够同样适用于单个对象和一组对象。一组对象由一个二维numpy数组表示:
>>> group = numpy.array([[11, 21, 31],
... [12, 22, 32],
... [13, 23, 33]])
第一个数字表示对象,第二个数字表示属性。即12
是对象1的属性2,21
是对象2的属性1。
为什么不颠倒顺序?因为我希望数组索引与属性对应。即object_or_group[0]
应该产生第一个属性,无论是作为单个数字还是作为numpy数组,以便进行进一步计算。
好的,所以当我想要计算点积时,例如这样就可以直接使用:
>>> obj = numpy.array([1, 2, 3])
>>> obj.dot(object_or_group)
“元素级加法”无效。
输入:
>>> group
array([[1, 2, 3],
[4, 5, 6]])
>>> obj
array([10, 20])
结果数组应该是
group
和obj
的第一个元素相加得到的,第二个元素也是类似的:>>> result = numpy.array([group[0] + obj[0],
... group[1] + obj[1]])
>>> result
array([[11, 12, 13],
[24, 25, 26]])
然而:
>>> group + obj
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2,3) (2,)
考虑到NumPy的广播规则,这是有道理的。
似乎没有一种NumPy函数可以沿指定轴执行加法(或等效的广播)。虽然我可以使用
>>> (group.T + obj).T
array([[11, 12, 13],
[24, 25, 26]])
这感觉非常繁琐(如果不考虑组,而是考虑单个对象,则感觉确实不对)。特别是因为numpy覆盖了其使用的每一个角落,我有一种感觉,可能在这里出现了某些概念上的错误。
总之
类似于
>>> obj1
array([1, 2])
>>> obj2
array([10, 20])
>>> obj1 + obj2
array([11, 22])
(执行逐元素 - 或属性 - 加法的函数)我希望对对象组执行相同操作:
>>> group
array([[1, 2, 3],
[4, 5, 6]])
当使用2D组数组时,其布局必须使单个对象沿第二轴(axis=1
)列出,以便能够通过正常索引请求特定属性(或多个属性):obj[0]
和group[0]
应该都返回第一个属性。
group[0]
是group
中的第一个对象,这其实很有道理。而group[:, 0]
是group
中所有对象的第一个属性。如果你需要区分一个组和一个对象,只需检查它的ndim
属性。组将具有 2,对象将具有 1。 - Mad Physicistobj_or_group[0] ** 2
,而不需要检查维度。我希望实现同样的加法,比如一个方法应该返回所有属性加上一些属性向量。我认为 numpy 的一个主要目的是允许在进入更高维度时使用类似的方程。 - a_guestnp.sum
这样的调用中始终指定axis=-1
。 - Mad Physicist