通常,我通过迭代一些数据来构建数组,例如:
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”,从一开始它就是一个数组?
答案 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))