Создать 3D-массив со значениями, которые используют три 1D Numpy массива - PullRequest
0 голосов
/ 05 июля 2019

У меня есть 3 одномерных массива numpy x, y и z.

Я хочу использовать значения этих числовых массивов для создания трехмерного числового массива (скажем, result), значения которого являются функциями значений, содержащихся в x, y и z.Я хочу, чтобы форма result была ( len(x) , len(y) , len(z) ).Значение, содержащееся в каждом индексе result, получается из нелинейной функции (скажем, func), которая использует соответствующие элементы из x, y и z.Например, значение, содержащееся в result[i,j,k], получается из func(x[i] , y[j] , z[k]).Эта же линейная функция используется для получения всех элементов result. Какой самый эффективный способ сделать это? В моей реальной работе массивы x, y и z будут очень больших размеров.

Я даюПример кода, который я использую ниже.В этом коде используется функция func = sin (x 2 ) • sin (y 2 ) • sin (z 2 ) Эта функцияэто только один пример нелинейной функции.Я хотел бы, чтобы код не был специфичным для вышеупомянутой функции (то есть, мне бы хотелось, чтобы код имел возможность использовать другие различные нелинейные функции.) Ниже приведен код, который у меня сейчас:

import numpy as np

x = np.array([1,2,3])
y = np.array([4,5,6])
z = np.array([7,8,9])

def func( xval, yval, zval ):
    return np.sin(xval**2) + np.sin( yval**2 ) + np.sin( zval**2 )

results = np.zeros( shape=( len(x) , len(y) , len(z) ) )

for i in range(len(x)):
    for j in range(len(y)):
        for k in range(len(z)):
            results[i,j,k] = func( x[i], y[j], z[k] )

Любая помощь будет оценена.

1 Ответ

1 голос
/ 05 июля 2019

Вы должны подходить к этому с точки зрения размеров вещания.

Сделайте так, чтобы каждый из ваших массивов вращался вокруг своей оси, и вы сможете применить формулу непосредственно к переменным:

import numpy as np

x = np.array([1,2,3])[:,None,None]
y = np.array([4,5,6])[None,:,None]
z = np.array([7,8,9])[None,None,:]

result = np.sin(x**2) + np.sin( y**2 ) + np.sin( z**2 )

print (result)


[[[-0.40018498  1.47359371 -0.07632033]
  [-0.24463342  1.62914527  0.07923124]
  [-1.10406052  0.76971817 -0.78019586]]

 [[-1.99845846 -0.12467977 -1.67459381]
  [-1.8429069   0.03087179 -1.51904224]
  [-2.702334   -0.82855531 -2.37846934]]

 [[-0.82953748  1.04424121 -0.50567283]
  [-0.67398592  1.19979277 -0.35012126]
  [-1.53341302  0.34036567 -1.20954836]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...