gpt4 book ai didi

python - 将 numpy 数组 append 到列表 - 奇怪的事情

转载 作者:太空宇宙 更新时间:2023-11-04 09:35:49 26 4
gpt4 key购买 nike

在 Raspberry Pi 上的 Raspbian 上使用 Spyder 3.1.3 中的 Python3.5.3。将两个 numpy 数组 append 到名为“list0”的列表中可以很好地处理分配的 numpy 数组“a”,例如:

import numpy as np

list0 = []
a = np.array([[1,2,3],[2,3,4]])
list0.append(a)
a = np.array([[11,12,13],[12,13,14]])
list0.append(a)

print("list0 =",list0)

效果很好,作为输出给出(对于帖子来说格式更好一点):

list0 = [ array([[ 1,  2,  3], [ 2,  3,  4]]), 
array([[11, 12, 13], [12, 13, 14]]) ]

使用循环替换对 a 的赋值,奇怪的事情发生了:

import numpy as np
a = np.empty((3), int)
list0 = []
for idx in range(4):
for i in range(3):
a[i] = idx*10 + i
print("idx =",idx,"; a =",a)
list0.append(a)
print("list0 =",list0)

第二行告诉 Python 使用的数组的形状(在我原来的例子中它是一个三维数组)。为了验证生成的名为“a”的数组被打印出来。将新填充的数组 'a' append 到 'list0' 最终显示最后一行的四次。

idx = 0 ; a = [ 0  1  2]
idx = 1 ; a = [10 11 12]
idx = 2 ; a = [20 21 22]
idx = 3 ; a = [30 31 32]
list0 = [ array([30, 31, 32]), array([30, 31, 32]),
array([30, 31, 32]), array([30, 31, 32]) ]

我想 'list0' 只包含四次指向数组 'a' 的指针,它只存在于一个实例/内存范围内。

那么:我怎样才能物理地将每个不同的数组“a” append (复制?)到列表中?它是一个 python 错误还是仅仅是我对某事的误解?当然我应该考虑更多 pythonian ;c)

谢谢你的帮助,彼得

最佳答案

问题

您将同一个数组 a append 到您的 list0 4 次。像 a 这样的数组是可变对象,这意味着,除其他外,当您为它们赋值时,底层对象会发生变化。由于该数组在您的列表中出现了 4 次,因此这些更改(似乎)出现在 4 个不同的地方。

解决方案

您可以通过一个小的更改来修复您的代码。将数组的副本 append 到您的列表,而不是数组本身:

import numpy as np
a = np.empty((3), int)
list0 = []
for idx in range(4):
for i in range(3):
a[i] = idx*10 + i
print("idx =",idx,"; a =",a)
list0.append(a.copy())
print("list0 =",list0)

输出:

idx = 0 ; a = [0 1 2]
idx = 1 ; a = [10 11 12]
idx = 2 ; a = [20 21 22]
idx = 3 ; a = [30 31 32]
list0 = [array([0, 1, 2]), array([10, 11, 12]), array([20, 21, 22]), array([30, 31, 32])]

优化方案

Python/Numpy 提供了许多更好的方法(在使用更少的代码行和运行速度方面)来初始化数组。对于像这样的一系列范围,这是一个合理的方法:

list0 = [np.arange(n*10, n*10+3) for n in range(4)]
print(list0)

输出:

[array([0, 1, 2]), array([10, 11, 12]), array([20, 21, 22]), array([30, 31, 32])]

您也可以考虑只使用一个二维数组来代替数组列表。一个数组通常比列表中的异构数组更容易处理。以下是您的操作方法:

arr0 = np.array([np.arange(n*10, n*10+3) for n in range(4)])
print(arr0)

输出:

[[ 0  1  2]
[10 11 12]
[20 21 22]
[30 31 32]]

关于python - 将 numpy 数组 append 到列表 - 奇怪的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53824618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com