2011-09-25 80 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