У меня есть большой 2D-массив, который я бы хотел объявить один раз, и изменил значение только значений в зависимости от параметра, не пересекая весь массив.Python lazy оценка numpy ndarray
Чтобы построить этот массив, я подклассифицировал класс 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.
Я затем переопределен метод __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.
Тем не менее, мне нужно работать с массивами с плавающей точкой в конце, и я не могу просто преобразовать этот массив в массив с помощью этой техники. Я также попытался использовать виды numpy, которые не работают ни для dtype=object
.
У вас есть альтернатива? Должен ли я переопределить метод view, а не getitem?
Редактировать Возможно, мне придется использовать Cython в будущем, поэтому, если у вас есть решение, включающее, например, C указатели, мне интересно.
Это интересный подход, но я не уверен, что для него подходят массивы numpy. В общем случае, когда вы работаете с numpy, вы должны использовать векторизованные операции с использованием полных массивов или срезов, а не по элементам доступа. Подклассифицируя ndarrays так, как вы, вы по существу теряете все преимущества быстрых операций numpy. Возможно, вам лучше просто создать свой собственный класс с нуля и сохранить все, в чистые структуры python (списки и т. Д.). Показательно, что это будет сопоставимо. Зачем вам нужна ленивая оценка? Вы можете эффективно изменять только некоторые элементы с помощью фантазийной индексации. – rth
У вас есть только одна функция 'f'? С постоянными аргументами? –
Вы знакомы с 'scipy.sparse'? Формат 'dok' - это словарь, с ключом' (i, j) 'tuple. Это и 'lil' (список списков) являются двумя наиболее быстрыми способами доступа к/изменения выбранных элементов. – hpaulj