在Python中通过迭代在numpy / scipy中构建一个数组?

时间:2010-04-14 23:13:33

标签: python numpy scipy

通常,我通过迭代一些数据来构建数组,例如:

my_array = []
for n in range(1000):
  # do operation, get value 
  my_array.append(value)
# cast to array
my_array = array(my_array)

我发现我必须首先构建一个列表然后将它(使用“array”)转换为数组。这有什么方法吗?所有这些转换调用使代码混乱......我怎样才能迭代地构建“my_array”,从一开始它就是一个数组?

3 个答案:

答案 0 :(得分:31)

NumPy提供'fromiter'方法:

def myfunc(n):
    for i in range(n):
        yield i**2


np.fromiter(myfunc(5), dtype=int)

产生

array([ 0,  1,  4,  9, 16])

答案 1 :(得分:15)

建议的方法是在循环之前预先分配并使用切片和索引来插入

my_array = numpy.zeros(1,1000)
for i in xrange(1000):
    #for 1D array
    my_array[i] = functionToGetValue(i)
    #OR to fill an entire row
    my_array[i:] = functionToGetValue(i)
    #or to fill an entire column
    my_array[:,i] = functionToGetValue(i)

numpy 提供array.resize()方法,但由于在循环内重新分配内存的成本,这将会慢得多。如果您必须具有灵活性,那么我担心唯一的方法是从array创建list

编辑:如果您担心为数据分配了太多内存,我会使用上面的方法进行过度分配,然后在完成循环时,使用{删除数组中未使用的位{1}}。这将比更快,而不是在循环内不断重新分配数组。

编辑:回应@ user248237的评论,假设你知道数组的任何一个维度(为了简单起见):

array.resize()

一般原则是“分配比您认为需要的更多,如果情况发生变化,请尽可能少地调整阵列大小”。加倍大小可能被认为是过多的,但实际上这是其他语言中几个标准库中的几个数据结构使用的方法(例如my_array = numpy.array(10000, SOMECONSTANT) for i in xrange(someVariable): if i >= my_array.shape[0]: my_array.resize((my_array.shape[0]*2, SOMECONSTANT)) my_array[i:] = someFunction() #lop off extra bits with resize() here 默认情况下这样做。我认为{{1}的几个实现在C ++中也可以这样做。)

答案 2 :(得分:-2)

如果我理解你的问题,这应该做你想要的:

# the array passed into your function
ax = NP.random.randint(10, 99, 20).reshape(5, 4)

# just define a function to operate on some data
fnx = lambda x : NP.sum(x)**2

# apply the function directly to the numpy array
new_row = NP.apply_along_axis(func1d=fnx, axis=0, arr=ax)

# 'append' the new values to the original array
new_row = new_row.reshape(1,4)
ax = NP.vstack((ax, new_row))