在你反对之前:每个程序员都是懒惰的。否则,您将不会手动编程和执行所有操作!
一个简单的例子。
我有一个类Line
,其中包含处理一条线所需的所有内容(例如使用两个顶点/点创建的对象)。这个类实际上非常复杂,为了简单、可维护性和清晰起见,我想保持这样:我用两个顶点提供一个类,并输出一些困难的结果,例如两点之间的距离。
问题
现在,问题是,虽然我需要跟踪这些单独的行,但有时我还想将它们作为一个整体来处理。例如,我想计算由多条线组成的路径的长度。
目前的解决方案和缺点
我创建了一个名为的类Lines
,它也为此提供了一些方法。
Lines
目前是一个numpy.ndarray
不那么伟大的孩子:
- 命名空间被 ndarray 的方法弄乱了;
- 我正在使用s在方法中
ufunc
提供一个包装器,但是在这样的两个地方维护代码是很乏味的。Lines
Line
问题
那么,你们将如何Line
在跟踪各个行的同时有效地“矢量化”类?
我可以将所有内容都放入Lines
并考虑Line
为一种特殊情况,我尝试过,但这确实会影响清晰度,并使各个行的所有引用都很难实现和维护。
代码示例
import numpy as np
class Line:
def __init__ (self, input_points):
assert len(np.array(input_points).squeeze()) == 2
self._points = np.array(input_points)
def get_distance(self):
return np.sqrt(((self._points[0]-self._points[1])**2).sum())
from itertools import combinations
class Lines(np.ndarray):
_get_dists = np.frompyfunc(Line.get_distance, 1, 1)
def __new__(cls, data):
comb = [Line(el) for el in combinations(data, 2)]
obj = np.asarray(comb).view(cls)
obj = obj.squeeze()
return obj
def get_all_distances(self):
return self._get_dists(self)