假设我有三个任意的一维数组,例如:
x_p = np.array((1.0, 2.0, 3.0, 4.0, 5.0))
y_p = np.array((2.0, 3.0, 4.0))
z_p = np.array((8.0, 9.0))
这三个数组代表3D网格中的采样间隔,我想为所有相交构造一个三维矢量的一维数组,例如
points = np.array([[1.0, 2.0, 8.0],
[1.0, 2.0, 9.0],
[1.0, 3.0, 8.0],
...
[5.0, 4.0, 9.0]])
订单实际上对此并不重要。生成它们的明显方法是:
npoints = len(x_p) * len(y_p) * len(z_p)
points = np.zeros((npoints, 3))
i = 0
for x in x_p:
for y in y_p:
for z in z_p:
points[i, :] = (x, y, z)
i += 1
所以问题是…有没有更快的方法?我看过但没有找到(可能只是找不到正确的Google关键字)。
我目前正在使用此:
npoints = len(x_p) * len(y_p) * len(z_p)
points = np.zeros((npoints, 3))
i = 0
nz = len(z_p)
for x in x_p:
for y in y_p:
points[i:i+nz, 0] = x
points[i:i+nz, 1] = y
points[i:i+nz, 2] = z_p
i += nz
但是我感觉好像错过了一些聪明的幻想的Numpy方式吗?
要在上述示例中使用numpy网格,将可以进行以下操作:
np.vstack(np.meshgrid(x_p,y_p,z_p)).reshape(3,-1).T
大于二维的Numpy meshgrid需要numpy
1.7。为了避免这种情况并从源代码中提取相关数据。
def ndmesh(*xi,**kwargs):
if len(xi) < 2:
msg = 'meshgrid() takes 2 or more arguments (%d given)' % int(len(xi) > 0)
raise ValueError(msg)
args = np.atleast_1d(*xi)
ndim = len(args)
copy_ = kwargs.get('copy', True)
s0 = (1,) * ndim
output = [x.reshape(s0[:i] + (-1,) + s0[i + 1::]) for i, x in enumerate(args)]
shape = [x.size for x in output]
# Return the full N-D matrix (not only the 1-D vector)
if copy_:
mult_fact = np.ones(shape, dtype=int)
return [x * mult_fact for x in output]
else:
return np.broadcast_arrays(*output)
检查结果:
print np.vstack((ndmesh(x_p,y_p,z_p))).reshape(3,-1).T
[[ 1. 2. 8.]
[ 1. 2. 9.]
[ 1. 3. 8.]
....
[ 5. 3. 9.]
[ 5. 4. 8.]
[ 5. 4. 9.]]
对于以上示例:
%timeit sol2()
10000 loops, best of 3: 56.1 us per loop
%timeit np.vstack((ndmesh(x_p,y_p,z_p))).reshape(3,-1).T
10000 loops, best of 3: 55.1 us per loop
对于每个尺寸为100的情况:
%timeit sol2()
1 loops, best of 3: 655 ms per loop
In [10]:
%timeit points = np.vstack((ndmesh(x_p,y_p,z_p))).reshape(3,-1).T
10 loops, best of 3: 21.8 ms per loop
根据您要处理的数据,可以返回一个视图:
%timeit np.vstack((ndmesh(x_p,y_p,z_p,copy=False))).reshape(3,-1).T
100 loops, best of 3: 8.16 ms per loop
问题内容: 我有一个看起来像这样的数组。这是一个二维数组。 我想使用此信息来创建一个新的三维数组,如下所示。 请对此有任何帮助。我陷入困境,需要弄清楚如何使用此原始数组创建新数组。因此,基本上,我将每台计算机上的所有作业分组在一起,而这些作业的密钥取决于它们在原始阵列中的状态。因此,如果原始阵列上有一个键为2的作业,而该机上没有其他作业具有更高的键,则它将变成该作业的键0,并使用该机器名创建一个新
我有一个像这样的数组。这是一个二维数组。 我想使用这些信息创建一个新的三维数组,如下所示。 请在这方面提供任何帮助将不胜感激。我遇到了一些问题,需要弄清楚如何使用这个原始数组创建新数组。所以基本上,我将来自每台机器的所有作业分组在一起,这些作业的键取决于它们在原始数组中的位置。因此,如果原始数组有一个键为2的作业,而该机器上没有其他作业有更高的键,那么它将成为该作业的键0,并创建一个具有该机器名的
问题内容: 我从http://www.movable-type.co.uk/scripts/latlong.html实现了“轴承”公式。但这似乎非常不准确- 我怀疑我的实现中存在一些错误。您能帮我找到它吗?我的代码如下: 问题答案: 您将括号放在错误的位置。 您正在将度数添加到以弧度为单位的值,这将不起作用。将为您完成从弧度到度的转换, 然后 在获得度值后进行归一化。 你有: 但是您需要: 也请记
假定我有以下数组: 我想创建一个新的数组,它由水果对象的第3个参数分组。这样我的数组就变成了 需要帮助在各自的Java8。我听说我们可以使用Map,但是任何人都可以给出小代码示例或任何其他实现指南。
问题内容: 我想要创建一个arraylist数组,如下所示: 但是它没有编译。我怎样才能做到这一点? 问题答案: 根据Oracle文档: “你不能创建参数化类型的数组” 相反,你可以执行以下操作: 正如汤姆·霍廷(Tom Hawting)的建议-定位线一样,最好这样做:
问题内容: 我想将同一数组的2个部分组合成一个复杂的数组: 这些不起作用: 我想念什么吗?numpy是否不喜欢对复数执行数组函数?这是错误: 问题答案: 这似乎可以满足您的要求: 这是另一种解决方案: 还有另一个更简单的解决方案: PS :如果要保存内存(无中间阵列): devS的以下解决方案也很快。