增加numy矩阵中的元素也会影响不同的矩阵和不相关的行

2024-06-16 15:57:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要构建两个数组,这样每个元素都是一个365元素的数组(以30/31元素的单个数组分隔),表示一个日历;第一个数组应该包含一天内发生的飞机航班数,第二个数组应该包含每天延误的航班数;两个数组中的每一行都应该包含一个特定旅行社的此类数据

我使用以下代码声明数组:

year = np.array([[0]*31,[0]*29,[0]*31,[0]*30,[0]*31,[0]*30,[0]*31,[0]*31,[0]*30,[0]*31,[0]*30,[0]*31,])
flights_1998_Carriers = np.array([year,]*14)
delays_1998_Carriers = np.array([year,]*14)

但是每当我为两个数组中的一个特定代理增加一个特定日期的值时,两个数组中的每个代理的同一天也会增加。例如:

print(flights_1998_Carriers[0][0][1])
print(delays_1998_Carriers[0][0][1])
flights_1998_Carriers[0][0][1] = flights_1998_Carriers[0][0][1] + 1
print(flights_1998_Carriers[0][0][1])
print(flights_1998_Carriers[1][0][1])
print(delays_1998_Carriers[0][0][1])

将打印结果:

0
0
1
1
1

我已经尝试了所有我能想到的方法,但我不明白为什么两个数组中的所有行都以这种方式链接。有人知道我把事情搞砸了吗?谢谢


Tags: 数据代码元素代理np数组arrayyear
1条回答
网友
1楼 · 发布于 2024-06-16 15:57:08
In [548]: year.shape                                                            
Out[548]: (12,)
In [549]: year.dtype                                                            
Out[549]: dtype('O')
In [550]: flights_1998_Carriers.shape                                           
Out[550]: (14, 12)

同时打印year。您将看到它是一个列表的对象数据类型数组

In [560]: flights_1998_Carriers.shape                                           
Out[560]: (14, 12)

由于[year,]*14结构,flights_1998_Carriers[:,0]中的所有元素引用相同的列表,也就是year[0]。如果修改year[0]的元素,也会看到flights...中的更改。以及delays...

year这样的对象数据类型数组本质上是一个列表列表,或者列表引用列表(存储在内存中的其他位置)。当你用list multiply语法创建一个新数组时,你会得到与list相同的重复问题

np.array([copy.deepcopy(year),]*14)

将此数组与year分离,但仍然复制引用14x。你需要copy14次

np.array([copy.deepcopy(year) for _ in range(14)])

像这样处理对象数组与普通列表相比没有什么优势。操作甚至可能更慢。它们当然不像数字numpy数组那样快

相关问题 更多 >