Представления очень полезны, и их правильное использование может помочь сэкономить немного памяти, но в вашем случае я не думаю, что представления являются подходящими. Хотя представление повторно использует базовые данные, я бы не назвал это указателем. Каждое представление является уникальным объектом ndarray, то есть оно имеет свои собственные свойства, например shape:
In [4]: a = np.arange(7)
In [5]: b = a[1:5]
In [6]: b.shape = (2,2)
In [7]: b
Out[7]:
array([[1, 2],
[3, 4]])
In [8]: a.shape
Out[8]: (7,)
поэтому, когда вы делаете b = a[0:1]
, вы создаете новый объект ndarray, который содержит один int / float / ... или что-то еще. Если вы хотите, чтобы у вас были значимые имена для каждого элемента вашего массива, вы, вероятно, не станете намного более эффективными, чем:
v = self.viewCoefs[sz][sv][sa]
gw = v[0]
G0 = v[1]
G1 = v[2]
G2 = v[3]
alpha0 = v[4]
## etc
При этом вы должны попытаться выяснить, существует ли лучший способ векторизации вашего кода, то есть попытаться записать ваш код как операции над массивами вместо операций над элементами массивов. Например, вы можете написать:
coefs = np.zeros((5,5))
lt = np.tril_indices(5)
coefs[lt] = self.viewCoefs[sz][sv][sa]
p = (coefs * scipy.log(bfrac)**[1, 2, 3, 4, 5]).sum(-1)
subSurfRrs = g*(p*u**[1, 2, 3, 4]).sum()
Векторизованный код может быть намного быстрее при использовании numpy. В этом случае мы также используем трансляцию Numpy, которая, как мне показалось, была очень запутанной, пока я не узнал ее немного лучше и не понял, насколько она полезна.