因此,我已经拥有或想要创建的是一个由不同参数组成的3D数组,然后我可以使用上的一个函数来创建一个新的3D数组(大小相同),并使用函数的结果。基本上我有这样的东西(R代码):
x <- seq(0,1,0.01)
y <- seq(0,1,0.01)
z <- seq(0,100,0.1)
假设我有一个函数,它就是:
result = x*data_point + y^2 + z^3
原则上,我可以只做三个循环,并将其保存到一个数组中(或类似的东西),但我认为这将花费大量的计算时间,特别是如果必须对几个数据点执行此步骤的话。在这种情况下,这意味着每个数据点大约有10.000.000次计算-我大约有1000次。所以总共大约有100亿次计算。我知道,为了得到这个结果矩阵,无论如何都需要一些时间,但有没有一些步骤可以让我尽可能快地做到这一点,或者循环是最好的方法?我还需要能够返回并说:“我希望数据点5上的x= 0.2,y= 0.2,z= 10”。
R语言的解决方案将是最好的,但如果用Python可以更快地完成,那也同样有效。
发布于 2018-08-06 07:11:50
最快的方法是使用Numpy的broadcasting (或here).I修改来自@EternusVia的代码,它比他更快的版本快大约14倍。尽可能避免for循环:)
import numpy as np
import time
# number of parameter values and patients
nx=100;
ny=100;
nz=100;
n_data=100;
# dummy data
x = np.linspace(0,1,nx);
y = np.linspace(1,2,ny);
z = np.linspace(2,3,nz);
data = np.linspace(0,100,n_data);
result2 = np.empty((n_data,nx,ny,nz));
# method 2 from @EternusVia
start = time.time()
y2=np.power(y,2);
z3=np.power(z,3);
for l in range(0,n_data):
for i in range(0,nx):
for j in range(0,ny):
result2[l,i,j,:]=x[i]*data[l]+y2[j]+z3[:]
end = time.time()
print(end-start)
# method 3 using Numpy broadcasting
# expand the dimensions of the array depending on where
# they are in the final array
x_bc = x[np.newaxis, :, np.newaxis, np.newaxis]
y_bc = y[np.newaxis, np.newaxis, :, np.newaxis]
z_bc = z[np.newaxis, np.newaxis, np.newaxis, :]
data_bc = data[:, np.newaxis, np.newaxis, np.newaxis]
start = time.time()
# just write the equation, broadcasting will to the rest
# of the magic and calculate the results element-wise
result3 = x_bc * data_bc + np.power(y_bc, 2) + np.power(z_bc, 3)
end = time.time()
print(end-start)
print(np.array_equal(result2,result3))
发布于 2018-08-06 02:31:39
这里有两种在Python中实现问题的方法;我对这两种方法都进行了计时。在我的机器上为100^4个元素运行第一个方法大约需要2分钟,而第二个方法只需要4秒。
import numpy as np
import time
# number of parameter values and patients
nx=100;
ny=100;
nz=100;
n_data=100;
# dummy data
x = np.linspace(0,1,nx);
y = np.linspace(1,2,ny);
z = np.linspace(2,3,nz);
data = np.linspace(0,100,n_data);
result1 = np.empty((n_data,nx,ny,nz));
result2 = np.empty((n_data,nx,ny,nz));
# method 1
start = time.time()
y2=np.power(y,2);
z3=np.power(z,3);
for l in range(0,n_data):
for i in range(0,nx):
for j in range(0,ny):
for k in range(0,nz):
result1[l,i,j,k] = x[i]*data[l]+y2[j]+z3[k]
end = time.time()
print(end-start)
# method 2
start = time.time()
y2=np.power(y,2);
z3=np.power(z,3);
for l in range(0,n_data):
for i in range(0,nx):
for j in range(0,ny):
result2[l,i,j,:]=x[i]*data[l]+y2[j]+z3[:]
end = time.time()
print(end-start)
print(np.array_equal(result1,result2))
输出:
133.110018015
4.36485505104
True
发布于 2018-08-06 07:34:26
你在找numpy.mgrid
吗?
import numpy as np
x, y, z = np.mgrid[0:1:0.01, 0:1:0.01, 0:100:0.1]
data = np.mgrid[0:100:0.1] # could use np.arange here, but why?
# this will take some time
result = x * data[..., np.newaxis, np.newaxis, np.newaxis] + y**2 + z**3
print(result.shape) # (100, 100, 100, 1000)
https://stackoverflow.com/questions/51699220
复制相似问题