为什么在Python中向np.array和列表中添加项目时方式不同
为什么在Python中向np.array和列表中添加项目时方式不同
我有一个代码,看起来像这样:\n
list_a = [] arr = np.array([]) for _ in range(1,101): list_a.append(np.random.randint(1,1001,100).mean()) arr = np.append(arr, np.random.randint(1,1001,100).mean()) print(f'转换为np.array后的平均值 - {np.array(list_a).mean()}') print(f'传统的平均值 - {sum(list_a)/len(list_a)}') print(f'仅使用arr.mean - {arr.mean()}') print(f'第一个数组元素 - {arr[0]}') print(f'第一个列表元素 - {list_a[0]}') print(f'最后一个arr元素 - {arr[99]}') print(f'最后一个列表元素 - {list_a[99]}')
\n这样打印出来:\n
转换为np.array后的平均值 - 498.9785 传统的平均值 - 498.97850000000005 仅使用arr.mean - 499.5889000000001 第一个数组元素 - 510.76 第一个列表元素 - 518.8 最后一个arr元素 - 527.54 最后一个列表元素 - 521.58
\n为什么我得到的均值不相等,为什么第一个和最后一个元素(我假设其余元素也是)在同一个循环中却不相等?将列表转换为np.array并获取平均值与仅将项目添加到np.array并获取平均值之间有什么区别?
问题的出现的原因是因为在向np.array和list中添加元素时,使用了不同的方法。当向np.array中添加元素时,使用了np.append()函数,而向list中添加元素时,使用了append()方法。np.append()函数会创建一个新的数组,并将原数组和要添加的值一起复制到新数组中,而list的append()方法则直接在原列表的末尾添加元素。
解决方法是将要添加的元素先存储在一个变量中,然后分别使用append()方法将元素添加到list和np.array中。这样可以确保两个列表中的元素相同。
以下是解决问题的代码:
import numpy as np list_a = [] arr = np.array([]) for _ in range(1, 101): value = np.random.randint(1, 1001, 100).mean() list_a.append(value) arr = np.append(arr, value) print(f'casted list to np.array mean - {np.array(list_a).mean()}') print(f'old school average - {sum(list_a)/len(list_a)}') print(f'just arr.mean - {arr.mean()}') print(f'first array element - {arr[0]}') print(f'first list element - {list_a[0]}') print(f'last arr element - {arr[99]}') print(f'last list element - {list_a[99]}')
第一个输出的平均值和第二个输出的平均值之间的差异是由print()函数的表示方式引起的,实际上,这两个平均值的差异只有0.000000000000005。
为什么在Python中向np.array和list追加元素时,均值不同?原因是数据不同。因为每次循环时,都会使用np.random.randint(1,1001,100).mean()来确定要追加到list_a的值,然后再使用相同方法来确定要追加到arr的值。np.random.randint用于产生随机数,因此在这两次调用中会产生不同的数组,所以均值不同,存储的值也不同。
当将list转换为np.array并计算均值与仅追加元素到np.array并计算均值之间是否有区别?在Python中,并没有所谓的“转换”,但是这两种方式得到的结果是相同的。虽然你的输出结果在一种情况下显示为498.9785,在另一种情况下显示为498.97850000000005,但这些结果非常接近。浮点数计算有时会涉及到一小部分的不精确性。
最后一部分是误导性的。差异很可能是由于显示偏好而不是数据实际差异所导致的。在OP报告的数据中,显示的小数位数是不同的,这让我对这种解释产生了怀疑。除了在格式字符串中明确指定之外,我也不知道是什么原因导致Python显示浮点值的精度不同。
Numpy数组和Python浮点数具有不同的repr。话虽如此,我理解你的观点。
谢谢,我忽略了一个如此明显的答案。不确定你为什么说在Python中没有所谓的“转换”,我认为转换就是将一种数据类型转换为另一种数据类型。
嗯,并不是每个人都使用完全相同的定义,但我认为与stackoverflow.com/questions/4337306/...中的基本定义类似。