我有一个大的 2D 数组,我想声明一次,并且偶尔只根据参数更改一些值,而不遍历整个数组。
为了构建这个数组,我已经将 numpy ndarray 类子类化dtype=object并分配给我想要更改函数的元素,例如:
def f(parameter):
return parameter**2
for i in range(np.shape(A)[0]):
A[i,i]=f
for j in range(np.shape(A)[0]):
A[i,j]=1.
Run Code Online (Sandbox Code Playgroud)
然后我重写了该__getitem__方法,以便它返回具有给定参数的函数的评估(如果它是可调用的),否则返回值本身。
def __getitem__(self, key):
value = super(numpy.ndarray, self).__getitem__(key)
if callable(value):
return value(*self.args)
else:
return value
Run Code Online (Sandbox Code Playgroud)
哪里self.args以前给了 myclass 的实例。
但是,我需要在最后使用浮点数组,我不能简单地将此数组转换为dtype=float使用此技术的数组。我还尝试使用 numpy 视图,这对dtype=object.
你有更好的选择吗?我应该覆盖 view 方法而不是 getitem 吗?
编辑我将来可能不得不使用 Cython,所以如果你有一个涉及 C 指针的解决方案,我很感兴趣。