簡體   English   中英

從2D數組到3D坐標數組的python

[英]python from 2D array to 3D coordinates array

我有一個稱為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為獨立的數組。 這使我們能夠廣播值。

  • 索引連同適當元件輸出的所述第一軸的前三個元素關閉a ,並確保這些形狀是broadcastable。

  • 將輸出重塑回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+倍以上,大型數據集的速度提高了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM