gpt4 book ai didi

Python 惰性求值 numpy ndarray

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:39 24 4
gpt4 key购买 nike

我有一个大型二维数组,我想声明一次,并且根据参数偶尔只更改一些值,而不遍历整个数组。

为了构建这个数组,我用 dtype=object 对 numpy ndarray 类进行了子类化,并分配给我想要更改函数的元素,例如:

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.

然后我重写了 __getitem__ 方法,以便它返回具有给定参数的函数的评估(如果它是可调用的),否则返回值本身。

    def __getitem__(self, key):
value = super(numpy.ndarray, self).__getitem__(key)
if callable(value):
return value(*self.args)
else:
return value

之前将 self.args 赋给了 myclass 的实例。

但是,我最后需要处理 float 数组,而且我不能使用这种技术简单地将此数组转换为 dtype=float 数组。我还尝试使用 numpy View ,它对 dtype=object 都不起作用。

你有更好的选择吗?我应该覆盖 View 方法而不是 getitem 吗?

编辑 我将来可能不得不使用 Cython,所以如果你有涉及例如的解决方案C 指针,我很感兴趣。

最佳答案

在这种情况下,将转换函数绑定(bind)到数组的每个索引是没有意义的。

相反,一种更有效的方法是将转换定义为一个函数,以及它所应用的数组的子集。这是一个基本的实现,

import numpy as np

class LazyEvaluation(object):
def __init__(self):
self.transforms = []

def add_transform(self, function, selection=slice(None), args={}):
self.transforms.append( (function, selection, args))

def __call__(self, x):
y = x.copy()
for function, selection, args in self.transforms:
y[selection] = function(y[selection], **args)
return y

可以按如下方式使用:

x = np.ones((6, 6))*2

le = LazyEvaluation()
le.add_transform(lambda x: 0, [[3], [0]]) # equivalent to x[3,0]
le.add_transform(lambda x: x**2, (slice(4), slice(4,6))) # equivalent to x[4,4:6]
le.add_transform(lambda x: -1, np.diag_indices(x.shape[0], x.ndim), ) # setting the diagonal
result = le(x)
print(result)

打印,

array([[-1.,  2.,  2.,  2.,  4.,  4.],
[ 2., -1., 2., 2., 4., 4.],
[ 2., 2., -1., 2., 4., 4.],
[ 0., 2., 2., -1., 4., 4.],
[ 2., 2., 2., 2., -1., 2.],
[ 2., 2., 2., 2., 2., -1.]])

通过这种方式,您可以轻松支持所有高级 Numpy 索引(逐元素访问、切片、花式索引等),同时将数据保存在具有 native 数据类型( floatint 等)的数组中这比使用 dtype='object' 更有效。

关于Python 惰性求值 numpy ndarray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30923220/

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