做的时候:
import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6,7])
print a+b
当然,有一个错误:
ValueError:操作数无法与形状(3,)(4,)
一起广播
当添加或增加两个不同大小的数组时,是否可以使numpy数组自动截断为最小尺寸?
示例:此处a
的长度为3,b
的长度为4,因此我们会在添加前自动将b
截断为长度3。 a+b
所需的结果:
[5 7 9]
可以通过继承np.array
吗?
备注:我希望避免手动使用a[:3] + b[:3]
自行截断所有数组。我希望能够只写a+b
。
答案 0 :(得分:3)
所以,首先:你想要做的是糟糕的形式。重新定义简单的操作通常会引起各种令人头疼的问题。对类似的东西进行子类化np.array似乎是一个可怕的想法。
据说,有可能做到。这是一种天真的方式:
import numpy as np
class truncarray(np.ndarray):
def __new__( cls, array ):
obj = np.asarray(array).view(cls)
return obj
def __add__( a, b ):
s = slice(0, min(len(a),len(b)))
return np.add(a[s],b[s])
__radd__ = __add__
a = truncarray([1,2,3])
b = truncarray([4,5,6,7])
a_array = np.array([1,2,3])
b_array = np.array([4,5,6,7])
现在,让我们看看这件事搞砸了一切:
根据您的喜好添加截断:
In [17]: a+b
Out[17]: truncarray([5, 7, 9])
添加号码不再有效:
In [18]: a_array+1
Out[18]: array([2, 3, 4])
In [19]: a+1
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-19-fdcaab9110f2> in <module>()
----> 1 a+1
<ipython-input-2-3651dc87cb0e> in __add__(a, b)
4 return obj
5 def __add__( a, b ):
----> 6 s = slice(0, min(len(a),len(b)))
7 return np.add(a[s],b[s])
8 __radd__ = __add__
TypeError: object of type 'int' has no len()
当考虑截断和阵列的混合时,添加不再具有传递性:
In [20]: a+b_array+a_array
Out[20]: truncarray([ 6, 9, 12])
In [21]: b_array+a+a_array
Out[21]: truncarray([ 6, 9, 12])
In [22]: b_array+a_array+a
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-22-bcd145daa775> in <module>()
----> 1 b_array+a_array+a
ValueError: operands could not be broadcast together with shapes (4,) (3,)
事实上,它甚至不是关联的(!):
In [23]: a+(b_array+a_array)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-23-413ce83f55c2> in <module>()
----> 1 a+(b_array+a_array)
ValueError: operands could not be broadcast together with shapes (4,) (3,)
至少,如果你这样做,你会想要为不同类型添加处理。但请考虑安东的回答:这是更安全的做法。
答案 1 :(得分:2)
您可以将两个数组切割为较小的数组,然后添加它们:
min_size = min(a.size, b.size)
c = a[:min_size] + b[:min_size]
print(c)
array([5, 7, 9])
修改强>
如果您不想手动执行此操作,则可以编写一个函数:
def add_func(*args):
to_trunc = min(map(len, args))
return np.sum([arg[:to_trunc] for arg in args], axis=0)
print(add_func(a,b))
[5 7 9]