Присвойте значения массиву срез - PullRequest
0 голосов
/ 05 апреля 2020

Я работаю с трехмерными массивами, и мне нужно взять дискретную производную вдоль заданной оси, которая состоит в том, чтобы взять разницу между двумя соседними плоскими срезами массива. До сих пор я сделал три функции, по одной для каждой производной.

Например, я беру производную вместе с x:

def take_derivative_x(data_box, msh):
    data_box_derivative = np.zeros_like(data_box)
    # the boundary derivatives
    data_box_derivative[0, :, :] \
          = (data_box[1, :, :] - data_box[0, :, :]) / msh[0]
    data_box_derivative[-1, :, :] \
          = (data_box[-1, :, :] - data_box[-2, :, :]) / msh[0]
    # the bulk derivatives
    for i in range(np.shape(data_box)[0] - 2):
        data_box_derivative[i+1, :, :] \
         = (data_box[i+2, :, :] - data_box[i, :, :]) / (2*msh[0])
    return data_box_derivative

Теперь я хочу создать функцию, которая делает это для массивы любого размера и принимает ось в качестве входных данных. Моя проблема в том, что после вычисления производной на плоском срезе я не могу найти способ поместить эти значения в новый массив, как это делается с помощью функции выше.

Вот что я сделал до сих пор:

def take_derivative(data_box, ax, msh):
    data_box_derivative = np.zeros_like(data_box)
    # the boundary derivatives
    data_box_derivative[0, :, :] # Problem here: I want [:,...,:, 0, :,...,:] with 0 at axis 'ax'
          = (np.take(data_box, 1, axis=ax) 
             - np.take(data_box, 0, axis=ax)) / msh[ax]
    data_box_derivative[-1, :, :] \ # Problem here
          = (np.take(data_box, -1, axis=ax)
             - np.take(data_box, -2, axis=ax)) / msh[ax]
    # the bulk derivatives
    for i in range(np.shape(data_box)[ax] - 2):
        data_box_derivative[i, :, :] \  # Problem here
              = (np.take(data_box, i+2, axis=ax) 
                 - np.take(data_box, i, axis=ax)) / (2*msh[ax])
    return data_box_derivative

Моя проблема сводится к поиску функции, которая для массивов

[[0 0 0]
 [0 0 0]
 [0 0 0]]

и [a b c], например, для i = 0, ax = 1

[[a 0 0]
 [b 0 0]
 [c 0 0]]

или для i = 1, топор = 0

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