gpt4 book ai didi

python从2D数组到3D坐标数组

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:58 25 4
gpt4 key购买 nike

我有一个名为 a 的 mXn numpy 数组:我想编写一个函数,它返回一个大小为 (3, mxn) 的数组,其中包含第一个数组中每对 (x,y) 对应的值。

import numpy as np

m=5
n=10
a = np.random.random((m, n))
x = np.random.random((m, 1)) # x coordinates
y = np.random.random((1, n)) # y coordinates


b = np.empty((3, m*n)) # array to store coordinates
k=0
for i in range (0,m):
for j in range (0,n):
b[0,k] = a[i,0]
b[1,k] = a[0,j]
b[2,k] = a[i,j]
k=k+1

这似乎运行正常,但是否有更快或更好的编码方式来做到这一点?

最佳答案

步骤:

  • 初始化一个3D数组,使得mn是分开的。这让我们可以传播值(value)观。

  • 使用 a 中的适当元素沿输出的第一个轴索引前三个元素,并确保这些形状是可广播的。

  • 将输出 reshape 回 2D

这就是所有的玩法!这是矢量化实现 -

b_out = np.empty((3, m,n),dtype=a.dtype)  # 1. Initialize 
b_out[0] = a[:,0,None] # 2. Assign
b_out[1] = a[0]
b_out[2] = a
b_out.shape = (3,m*n) # 3. Reshape back to 2D

运行时测试

方法-

def loopy_app(a):
m,n = a.shape
b = np.empty((3, m*n),dtype=a.dtype)
k=0
for i in range (0,m):
for j in range (0,n):
b[0,k] = a[i,0]
b[1,k] = a[0,j]
b[2,k] = a[i,j]
k=k+1
return b

def vectorized_app(a):
b_out = np.empty((3, m,n),dtype=a.dtype)
b_out[0] = a[:,0,None]
b_out[1] = a[0]
b_out[2] = a
b_out.shape = (3,m*n)
return b_out

时间 -

In [194]: m=5
...: n=10
...: a = np.random.random((m, n))
...:

In [195]: %timeit loopy_app(a)
...: %timeit vectorized_app(a)
...:
10000 loops, best of 3: 28.2 µs per loop
100000 loops, best of 3: 2.48 µs per loop

In [196]: m=50
...: n=100
...: a = np.random.random((m, n))
...:

In [197]: %timeit loopy_app(a)
...: %timeit vectorized_app(a)
...:
100 loops, best of 3: 2.56 ms per loop
100000 loops, best of 3: 6.31 µs per loop

In [198]: 2560/6.31
Out[198]: 405.7052297939778

400x+ 在大型数据集上加速,在更大的数据集上加速更多!

关于python从2D数组到3D坐标数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44430113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com