Создать открытые сетки из этих входов и затем выполнить те же самые операции -
RI,PI,TI = np.ix_(r,phi,theta) # get open grids
X = RI*np.cos(PI)*np.sin(TI)
Y = RI*np.sin(PI)*np.sin(TI)
Z = np.repeat(RI*np.cos(TI),sampling,axis=1)
Альтернатива # 1: Эти открытые сетки также могут быть построены с явным добавлением оси, например -
RI,PI,TI = r[:,None,None], phi[:,None], theta
Альтернатива # 2: мы можем предварительно вычислить np.sin(TI)
и повторно использовать его в два этапа.
Альтернатива # 3: Кроме того, для транслируемой версии Z
только для чтения мы можемиспользуйте np.broadcast_to
-
Z = np.broadcast_to(RI*np.cos(TI),(sampling,sampling,sampling))
Альтернатива # 4: использование многоядерных процессоров с модулем numexpr
-
import numexpr as ne
X = ne.evaluate('RI*cos(PI)*sin(TI)')
# similarly Y and Z
Обратите внимание, что выходные значения будут 3D
массивами. Таким образом, чтобы получить эквивалентные, вы можете сгладить их. Для этого же мы можем использовать .ravel()
на выходах.