1

我不明白为什么以下代码的行为方式如此。

import numpy as np


nbr_arrays = 4
nbr_fields_per_array = 3
nbr_subfields_per_field = 2

# pre-allocate zeros list
zeros = np.zeros(nbr_subfields_per_field)

data = []
for array in range(nbr_arrays):

    # pre-allocate the subarray 
    empty_array = []
    for empty_array_index in range(nbr_fields_per_array):
        empty_array.append(zeros)

    # append pre subarray to data
    data.append(empty_array)

    # fill up data
    for j in range(nbr_fields_per_array):
        for k in range(nbr_subfields_per_field):
            data[array][j][k] = j*k*array

生成的输出data现在显示:

[[array([ 0.,  6.]), array([ 0.,  6.]), array([ 0.,  6.])],
 [array([ 0.,  6.]), array([ 0.,  6.]), array([ 0.,  6.])],
 [array([ 0.,  6.]), array([ 0.,  6.]), array([ 0.,  6.])],
 [array([ 0.,  6.]), array([ 0.,  6.]), array([ 0.,  6.])]]

甚至zeros读起来完全不同:

array([ 0.,  6.])

如果我查看不同列表的标识,这就是我得到的:

id(data[0][0])
Out[72]: 45790208

id(data[1][0])
Out[66]: 45790208

id(data[2][0])
Out[67]: 45790208

id(data[3][0])
Out[68]: 45790208

id(zeros)
Out[69]: 45790208

为什么所有的参考文献都一样?为什么zero突然包含非零值?

如果有人能解释一下这里到底发生了什么,以及我必须如何修改我的代码以查看预期的行为(输出),我将不胜感激。

编辑:

不使用zeros而是使用[[0]*nbr_subfields_per_field for x in range(nbr_fields_per_array)]给了我预期的结果。但为什么?为什么原始代码不起作用?修改后的代码有效:

data = []
for array in range(nbr_arrays):
    empty_array = [[0]*nbr_subfields_per_field for x in range(nbr_fields_per_array)]

    ''' this is causing the weird behaviour 
    empty_array = []
    for empty_array_index in range(nbr_fields_per_array):
        empty_array.append(zeros)
    '''

    data.append(empty_array)

    for j in range(nbr_fields_per_array):
        for k in range(nbr_subfields_per_field):
            data[array][j][k] = j*k*array
4

2 回答 2

1
# pre-allocate zeros list
zeros = np.zeros(nbr_subfields_per_field)

这将创建一个对象。

for empty_array_index in range(nbr_fields_per_array):
    empty_array.append(zeros)

这会不断附加相同的对象。

停止预分配。

于 2012-05-23T23:07:20.347 回答
0

如果您愿意,Numpy 可以为您设置多维数组。由于您将在创建整个数组后立即对其进行初始化,因此该empty方法似乎是最合适的:

data = np.empty((nbr_arrays, nbr_fields_per_array, nbr_subfields_per_field))
于 2012-05-23T23:44:39.540 回答