gpt4 book ai didi

python - 自动截断 numpy 数组

转载 作者:行者123 更新时间:2023-11-28 21:48:50 28 4
gpt4 key购买 nike

做的时候:

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6,7])
print a+b

当然有错误:

ValueError: operands could not be broadcast together with shapes (3,) (4,)

当两个不同大小的数组相加或相乘时,是否可以使 numpy 数组自动截断为最小大小?

示例:此处 a 的长度为 3,b 的长度为 4,因此我们在执行之前自动将 b 截断为长度 3添加。 a+b 的期望结果:

[5 7 9]

这可以通过子类化 np.array 来完成吗?

备注:我想避免使用 a[:3] + b[:3] 自己手动截断所有数组。我希望能够只编写 a+b

最佳答案

所以,首先:你想要做的是糟糕的形式。重新定义简单的操作通常会引起各种令人头疼的问题。为这样的东西子类化 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()

当考虑 truncarrays 和数组的混合时,加法不再具有传递性:

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,)

至少,如果您这样做,您需要添加对不同类型的处理。但请考虑 Anton 的回答:这是更安全的方法。

关于python - 自动截断 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34581208/

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