Как избежать цикла for при использовании append () - PullRequest
1 голос
/ 29 сентября 2019

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

У меня есть 4-мерный куб измерений давления, где размеры (количество образцов, время, ось Y, ось X), что означает, что для каждого образца у меня есть 3Dкуб пространственно-временного профиля.Мне нужно собрать показания давления этого трехмерного куба (время, ось Y, ось X) и сохранить его в массив для каждого образца только там, где координаты удовлетворяют определенному условию.При изменении конкретного условия размер этого массива также будет меняться.Итак, я должен использовать append () для создания этого массива.Однако, поскольку, скажем, для 1000 выборок, мне приходится искать более миллиона координат с использованием For-Loop для каждой выборки, написанный мною код довольно неэффективен и требует много времени для запуска (более нескольких часов).Можете ли вы помочь мне написать это более эффективно?

Ниже приведен код, который я пытался решить проблему.Это работает хорошо и дает ожидаемый результат, но это очень медленно.

import numpy as np

# Number of sample points in x,y and t-axis
Nx = 101
Ny = 101
Nt = 100
n_train = 1000
target_array = []

for i_train in range (n_train):
    for k in range (Nt):
        for j in range (Ny):
            for i in range (Nx):
                if np.round(np.sqrt((i-np.round(Nx/2))**2+(j-np.round(Ny/2))**2)) == 2*k:
                    target_array.append(Pressure[i_train,k,j,i])

1 Ответ

1 голос
/ 29 сентября 2019

Поскольку условие включает в себя индексы, а не значения вашего 4D-массива, вы можете векторизовать его, используя numpy.meshgrid .

Здесь pp - это ваш 4D-массив:

iv, jv, kv = np.meshgrid(np.arange(pp.shape[3]), np.arange(pp.shape[2]), np.arange(pp.shape[1]))
selecting = np.round(np.sqrt((iv - np.round(pp.shape[3]/2))**2 + (jv - np.round(pp.shape[2]/2))**2)) == 2*kv
target = pp[:,selecting]

При условии, что я правильно понял, как организован ваш 4D массив:

  • массивы, созданные с помощью meshgrid, содержат индексы для выбора элементов pp в 3 измеренияхx, y, t.
  • selecting - логический массив, созданный путем репликации вашего уравнения, чтобы проверить, какие координаты удовлетворяют условию.
  • target - это выборка pp,Возьмите все элементы по оси 0, которые удовлетворяют условию (т. е. selecting - Истина), по остальным 3 осям.

Обратите внимание, что target - это двумерный массив, чтобы иметь одномерный массив, используйтеtarget.flatten().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...