2011-09-25 81 views
4

有沒有辦法動態擴展的陣列SciPy的動態擴展一個SciPy的陣列

from scipy import sci
time = sci.zeros((n,1), 'double')

我們可以增加time數組的大小之後呢?

+0

SCI不規範,解釋它 –

回答

5

可以使用resize方法擴展數組,但對於大型數組可能會很慢,所以請儘量避免使用*

例如:

import scipy as sci 
n=3 
time = sci.zeros((n,1), 'double') 
print(time) 
# [[ 0.] 
# [ 0.] 
# [ 0.]] 

time.resize((n+1,2)) 
print(time) 
# [[ 0. 0.] 
# [ 0. 0.] 
# [ 0. 0.] 
# [ 0. 0.]] 

*相反,找出你從一開始的數組多大需要,並分配該形狀time只有一次。一般來說,過度分配比調整大小要快。

+0

所以,問題是,我不知道陣列的大小,我想提前。所以,我迭代並逐個增加數組的大小。像這樣 'N = 1' '時間= sci.zeros((1,1), '雙師型')' 和 '爲(我的東西):' 'time.resize( (n + 1),'double')' scipy lib會做什麼,它只是在新的地方複製數組的前幾個元素,因爲這會很慢。 – Harman

+2

我會將數據追加到普通的Python列表(或列表列表)中,然後在大小固定後將其轉換爲具有'time = np.array(time)'的numpy數組。 – unutbu

4

生成的time數組只是一個Numpy Array,您可以使用標準的Numpy方法來操作它們,例如numpy#insert,它將返回一個修改後的數組,其中插入了新的元素。實例的使用,從NumPy的文檔(這裏np是短期的numpy):

>>> a = np.array([[1, 1], [2, 2], [3, 3]]) 
>>> a 
    array([[1, 1], 
      [2, 2], 
      [3, 3]]) 
>>> np.insert(a, 1, 5) 
    array([1, 5, 1, 2, 2, 3, 3]) 
>>> np.insert(a, 1, 5, axis=1) 
    array([[1, 5, 1], 
      [2, 5, 2], 
      [3, 5, 3]]) 

此外,numpy#insertnumpy#resize快:

>>> timeit np.insert(time, 1, 1, 1) 
    100000 loops, best of 3: 16.7 us per loop 

>>> timeit np.resize(time, (20,1)) 
    10000 loops, best of 3: 27.1 us per loop