【问题标题】:Create 3D array with values which use three 1D Numpy arrays使用三个 1D Numpy 数组的值创建 3D 数组
【发布时间】:2019-07-04 23:35:53
【问题描述】:

我有 3 个一维 numpy 数组 xyz

我想使用这些 numpy 数组的值来创建一个 3D numpy 数组(比如result),其值是包含在xyz 中的值的函数。我希望result 的形状为( len(x) , len(y) , len(z) )result 的每个索引中包含的值是从使用来自 xyz 的相应元素的非线性函数(例如 func )获得的。例如,result[i,j,k] 中包含的值是从func(x[i] , y[j] , z[k]) 中获取的。相同的线性函数用于获取result 的所有元素。 这样做最有效的方法是什么?在我的实际工作中,数组xyz 的大小会非常大。

我在下面给出一个我正在使用的代码示例。此代码使用函数 func = sin(x2) • sin(y2) • sin(z2) 这个函数只是非线性函数的一个例子。我希望代码不特定于上述函数(即,我希望代码能够使用其他不同的非线性函数。)以下是我现在拥有的代码:

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] )

任何帮助将不胜感激。

【问题讨论】:

  • 计算速度取决于你的func。如果它仅适用于标量值,则必须为x,y,z 的每个组合调用一次。迭代方法没有太大区别。但是如果它接受整个数组,并且更好地利用numpy 广播,它可以只调用一次,整个x,y,z 网格 - 这会很快。所写的func 应该以这种方式工作。

标签: python arrays numpy


【解决方案1】:

您必须在广播维度方面解决这个问题。

让你的每个数组都在自己的轴上,你将能够将公式直接应用于变量:

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]]]

【讨论】:

    猜你喜欢
    • 2013-08-17
    • 2021-08-15
    • 2018-12-11
    • 1970-01-01
    • 2018-01-05
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多