2013-02-02 156 views
1

我正在定義兩個數組,每個數組都有一個。在MATLAB中,這可以通過將數組從MATLAB轉換爲numpy

x = [1 2*ones(1,3) 1] 

在Python中來達到的,但是,numpy的給人完全不同的東西:

import numpy 
numpy.array([[1],2*numpy.ones(3),[1]]) 

什麼是Python中執行此MATLAB命令的最有效方法是什麼?

回答

7
In [33]: import numpy as np 

In [34]: np.r_[1, 2*np.ones(3), 1] 
Out[34]: array([ 1., 2., 2., 2., 1.]) 

或者,你可以使用hstack

In [42]: np.hstack(([1], 2*np.ones(3), [1])) 
Out[42]: array([ 1., 2., 2., 2., 1.]) 

In [45]: %timeit np.r_[1, 2*np.ones(300), 1] 
10000 loops, best of 3: 27.5 us per loop 

In [46]: %timeit np.hstack(([1], 2*np.ones(300), [1])) 
10000 loops, best of 3: 26.4 us per loop 

In [48]: %timeit np.append([1],np.append(2*np.ones(300)[:],[1])) 
10000 loops, best of 3: 28.2 us per loop 

感謝帝斯曼指出,預分配從一開始就正確大小的數組,可以不是追加,在較小的陣列使用r_hstack快得多得多:

In [49]: %timeit a = 2*np.ones(300+2); a[0] = 1; a[-1] = 1 
100000 loops, best of 3: 6.79 us per loop 

In [50]: %timeit a = np.empty(300+2); a.fill(2); a[0] = 1; a[-1] = 1 
1000000 loops, best of 3: 1.73 us per loop 
+0

謝謝unutbu。未來,我應該如何努力尋找這樣的例程? – Doubt

+0

應該注意的是'r_'可以比簡單地做'2 * ones(n + 2)'慢4倍,然後修補邊緣。這當然不會成爲一個問題,除非它在內部循環中。 – DSM

+0

@DSM:你能否詳細說明一下?也許它取決於numpy的版本?我將'r_'與'hstack'進行了比較,並得到了大致相當的結果。 – unutbu

0

使用numpy.ones,而不是僅僅的:

numpy.array([[1],2*numpy.ones(3),[1]]) 
+0

這將使一個非常不同的對象,而不是array([1,2,2,2,1]) - 這是OP的問題。 (如果OP的代碼有效,可能是''numpy import *'發生了,或者OP只是錯誤地複製了代碼。) – DSM

+0

謝謝,我已經解決了這個問題。對困惑感到抱歉。 – Doubt