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

kognpnkq  于 2022-11-10  发布在  Python
关注(0)|答案(4)|浏览(144)

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

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”,从一开始它就是一个数组?

mrwjdhj3

mrwjdhj31#

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])
hjqgdpho

hjqgdpho2#

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

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()方法,但是由于在循环中重新分配内存的成本,这将慢得多。如果您 * 必须 * 具有灵活性,那么恐怕唯一的方法是从list创建一个array
编辑:如果你担心你为你的数据分配了太多的内存,我会使用上面的方法来过度分配,然后当循环完成时,使用array.resize()删除数组中未使用的位。这将比在循环中不断地重新分配数组快 * 远 远 *。
编辑:作为对@user248237评论的回应,假设您知道数组的任意一维(为简单起见):

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

一般的原则是“分配比您认为需要的更多的空间,如果情况发生变化,尽可能少地调整数组的大小”。将大小加倍可能被认为是过分的,但实际上这是其他语言的几个标准库中的几个数据结构所使用的方法(例如,默认情况下java.util.Vector会这样做。我认为C++中的几个std::vector实现也会这样做)。

yh2wf1be

yh2wf1be3#

使用list.append()构建数组似乎比动态调整Numpy数组的大小要快得多:
第一个

n9vozmp4

n9vozmp44#

如果我没理解错你的问题,这应该能满足你的要求:


# 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))

相关问题