У меня есть большая матрица (форма: 2e6, 6), содержащая геофизические данные. У меня есть 3 for
циклы, прежде чем искать значения в матрице для назначения переменных.Улучшение производительности python-матрицы
Мое первое решение есть с np.where
. Это слишком медленно! Я прочитал it would be better, чтобы использовать другой цикл for
для повышения производительности. Однако код, который я придумал, даже немного медленнее.
Есть ли у кого-нибудь идеи, как улучшить производительность, пожалуйста?
Первое решение (np.where
)
for lat in LATS:
for lon in LONS:
for depth in range(1,401,1):
node_point_line = matrix[np.where((matrix[:,0]==lat) * (matrix[:,1]==lon) * (matrix[:,2]==depth))][0]
var1 = node_point_line[3]
var2 = node_point_line[4]
var3 = node_point_line[5]
...
Второе решение (дополнительный for
петля)
for lat in LATS:
for lon in LONS:
for depth in range(1,401,1):
matrix_flat = matrix.flatten()
for i in range(len(matrix_flat)):
if matrix_flat[i]==lat and matrix_flat[i+1]==lon and matrix_flat[i+2]==depth:
var1 = matrix_flat[i+3]
var2 = matrix_flat[i+4]
var3 = matrix_flat[i+5]
...
Опять же, оба решения слишком медленно. Я избегаю Fortran или C++ (я знаю, что это быстрее). Какие-либо предложения?
Это не так много, что 'where' медленно, но что вы делаете это много раз. Вы повторяете три уровня. Что вы делаете с 'var1, var2, var3'? – hpaulj
Я использую эти переменные для вычисления интеграла по глубине для каждой точки LAT/LON. – Johngoldenboy
@Johngoldenboy выглядит как проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) здесь: вы просите оптимизировать определенную часть алгоритма (lookups), пытаясь решить большую проблему. Я бы предложил открыть отдельный вопрос (возможно, на веб-сайте [CS] (http://cs.stackexchange.com/)) с просьбой о более быстром алгоритме вычисления интеграла. Я думаю, что вы делаете крайне субоптимально, но трудно рассуждать, поскольку я не знаю, что именно вы пытаетесь сделать. – yeputons