Оптимизация создания numy mesh для эффективной интерполяции - PullRequest
1 голос
/ 17 марта 2019

Я читаю данные магнитного поля из текстового файла.Моя цель - правильно и эффективно загрузить точки сетки (в 3-х измерениях) и связанные поля (для простоты ниже я буду предполагать, что у меня есть скалярное поле).

Мне удалось заставить его работать, однако ячувствую, что некоторые шаги могут не понадобиться.В частности, при чтении numpy документа может оказаться, что «широковещание» могло бы использовать свое волшебство в мою пользу.

import numpy as np
from scipy import interpolate
# Loaded from a text file, here the sampling over each dimension is identical but it is not required
x = np.array([-1.0, -0.5, 0.0, 0.5, 1.0])
y = np.array([-1.0, -0.5, 0.0, 0.5, 1.0])
z = np.array([-1.0, -0.5, 0.0, 0.5, 1.0])
# Create a mesh explicitely
mx, my, mz = np.meshgrid(x, y, z, indexing='ij')  # I have to switch from 'xy' to 'ij'
# These 3 lines seem odd
mx = mx.reshape(np.prod(mx.shape))
my = my.reshape(np.prod(my.shape))
mz = mz.reshape(np.prod(mz.shape))
# Loaded from a text file
field = np.random.rand(len(mx))
# Put it all together
data = np.array([mx, my, mz, field]).T
# Interpolate
interpolation_points = np.array([[0, 0, 0]])
interpolate.griddata(data[:, 0:3], data[:, 3], interpolation_points, method='linear')

Действительно ли необходимо создавать меш таким образом?Можно ли сделать его более эффективным?

1 Ответ

1 голос
/ 17 марта 2019

Вот пример с broadcasted-assignment для генерации data непосредственно из x,y,z и, следовательно, для избежания накладных расходов памяти при создании всех сеток и, как мы надеемся, для повышения производительности -

m,n,r = len(x),len(y),len(z)
out = np.empty((m,n,r,4))
out[...,0]  = x[:,None,None]
out[...,1]  = y[:,None]
out[...,2]  = z
out[...,3]  = np.random.rand(m,n,r)
data_out = out.reshape(-1,out.shape[-1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...