В настоящее время у меня есть проблема, когда у меня есть массив формы (60,60), где каждая точка сама по себе является массивом формы (11,11). Это вызывает у меня проблемы, потому что каждая точка массива (60,60) является объектом, а не числом с плавающей запятой:
P_arr.shape
(60,60)
P_arr[i,j].shape
(11,11)
P_arr[i,j][k,l]
1.0
Для матричных операций, которые мне нужно выполнить позже, мне нужно получить доступ к каждому значению с плавающей запятой массива в определенном порядке. Мне нужно, чтобы новый массив имел форму (11,11,60,60), где каждая точка была бы числом с плавающей запятой. В идеале я хотел бы достичь этой точки:
New_P_arr[k,l,i,j]
1.0
Есть ли способ извлечь значения с плавающей запятой из внутренних 2D-массивов, чтобы преобразовать их в желаемую форму? Мне нужно решение, которое быстрее, чем зацикливание, потому что в будущем оно значительно расширится. Я пробовал сглаживание, vstack, конкатенацию и т. д. Проблема с сглаживанием, например, заключается в следующем:
New_P_arr = np.concatenate(P_arr)
New_P_arr.shape
(3600,)
New_P_arr[i].shape
(11,11)
Таким образом, выравнивание массива (или другие операции) не позволит мне получить доступ ко всем значениям в пределах одного индекса квадратных скобок. Моя первоначальная мысль состояла в том, чтобы сгладить массив, чтобы изменить его форму, но поскольку точки являются объектами, а не числами с плавающей запятой, это тоже не сработает.
РЕДАКТИРОВАТЬ: Вот как я сгенерировал P_arr. Мне нужно решить связанную функцию Лежандра для выбора значений 11 l и 11 m по сетке тета-значений формы (60,60). В Scipy есть пакет lpmn, который вычисляет связанные полиномы Лежандра, а также их производные (которые мне не нужны), но он не векторизован. Он возвращает массив (11,11) с заданным тета-значением для каждого l и m до значения, которое я ввожу (от 0 до 10, откуда берется 11). Это код:
import numpy as np
from scipy.special import lpmn
lmax = 10
mmax = lmax
theta = np.arange(0, 180., 3)
theta = theta*np.pi/180.
phi = theta
ph, th = np.meshgrid(theta, phi)
cos_th = np.cos(th)
th is a (60,60) array of theta values from 0-pi in equal steps
@np.vectorize
def asscP(m, l, cos_theta):
return lpmn(m, l, cos_theta)[0]
asscP = np.vectorize(asscP, excluded={0,1}, otypes=[np.ndarray])
P_arr = asscP(mmax, lmax, cos_th)