【问题标题】:python from 2D array to 3D coordinates arraypython从2D数组到3D坐标数组
【发布时间】:2017-06-08 08:08:13
【问题描述】:

我有一个 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

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

【问题讨论】:

  • 看起来您正在尝试以自己的方式构建网格。看看这个:docs.scipy.org/doc/numpy/reference/generated/…
  • 这很有用,但据我了解,它只返回 x,y 坐标,不返回第三个坐标
  • 我认为你需要使用range (0,m)range (0,n)来覆盖所有元素。
  • 感谢@Divakar,我刚刚注意到一些奇怪的值
  • 你根本没有使用 x,y 吗?为什么要麻烦把它放在你的代码中?

标签: python arrays performance numpy


【解决方案1】:

步骤:

  • 初始化一个3D数组,这样mn是分开的。这让我们可以广播值。

  • 在输出的第一个轴上索引前三个元素,适当的元素关闭a,并确保这些形状是可广播的。

  • 将输出重新整形为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+ 在大型数据集上加速,在大型数据集上加速!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    相关资源
    最近更新 更多