当前位置: 首页 > 知识库问答 >
问题:

dtype对象的Numpy数组对于sys具有截然不同的值。getsizeof()和n字节

茅鸿宝
2023-03-14

我有一个名字的样本数据集。它是一个csv文件,有两列,每列200行。两列都包含随机名称。我有以下代码将csv文件加载到pandas数据帧中,将数据帧转换为numpy数组,然后将numpy数组转换为标准python列表。代码如下:

x_df = pd.read_csv("names.csv")
x_np = x_df.to_numpy()
x_list = x_np.tolist()

print("Pandas dataframe:")
print('Using sys.getsizeof(): {}'.format(sys.getsizeof(x_df)))
print('Using pandas_df.memory_usage(): {}'.format(x_df.memory_usage(index=True, deep=True).sum()))

print('\nNumpy ndarray (dtype: {}):'.format(x_np.dtype))
print('Using sys.getsizeof(): {}'.format(sys.getsizeof(x_np)))
print('Using ndarray.nbytes: {}'.format(x_np.nbytes))
total_mem = 0
for row in x_np:
    for name in row:
        total_mem += sys.getsizeof(name)
print('Using sys.getsizeof() on each element in np array: {}'.format(total_mem))

print('\nStandard list:')
print('Using sys.getsizeof(): {}'.format(sys.getsizeof(x_list)))
total_mem = sum([sys.getsizeof(x) for sublist in x_list for x in sublist])
print('Using sys.getsizeof() on each element in list: {}'.format(total_mem))

该代码的输出如下:

Pandas dataframe:
Using sys.getsizeof(): 25337
Using pandas_df.memory_usage(): 25305

Numpy ndarray (dtype: object):
Using sys.getsizeof(): 112
Using ndarray.nbytes: 3200
Using sys.getsizeof() on each element in np array: 21977

Standard list:
Using sys.getsizeof(): 1672
Using sys.getsizeof() on each element in list: 21977

我想我明白了,对于标准的python列表,为什么sys.getsizeof()与在列表的每个元素上使用sys.getsizeof()相比是如此的小整体只显示列表对象,其中包含对列表元素的引用。

同样的逻辑适用于Numpy数组吗?与列表相比,数组上的nbytes的值为什么这么小?Numpy是否具有出色的内存管理,或者Numpy数组是否由引用而不是实际对象组成?如果Numpy数组由引用组成,而不是实际对象,这是否适用于所有dtype?或者只是对象dtype?

共有1个答案

袁宜民
2023-03-14

包含字符串的数据框将是对象dtype。

22008(每个指针8个字节)是3200,数组nbytes112只是数组对象的大小(形状、步幅等),而不是数据缓冲区。显然,它是x_df用来存储其引用的数组的视图。

熊猫数据存储比numpy更复杂,但显然,如果跨列的数据类型是统一的,那么它确实使用了2dndarray。我不知道getsizeofmemory\u usage(使用这些参数)是如何工作的,尽管数字表明它们是相同的。

枚举大小表明字符串元素的平均长度为6-7字节。这对于unicode来说似乎很小,但您还没有告诉我们这些“随机名称”。

枚举列表的作用显然与numpy枚举相同。我有点惊讶,16723200小得多,好像列表的指针数组包含4字节指针而不是8字节指针。

 类似资料:
  • 我的问题是"为什么?:" 这些数组完全相同。 我的最小示例并没有再现这一点: 这个也没有: 我不知道为什么这些不平等。还有一个额外的问题,我如何比较它们? 我需要一种有效的方法来检查aaa是否在堆栈aa中。 我没有在aa中使用

  • 问题内容: 一个人如何处理一个javascript对象数组,例如: 并通过将值相加来合并重复的键。为了得到这样的东西: 我尝试迭代并添加到新数组,但这没有用: 问题答案: 您应该使用属性将未找到的每个对象分配给结果。 如果找到它,则需要添加它。 另外,部分问题是您正在重用变量来引用的值,因此您失去了对该对象的引用。

  • 问题内容: 一个人如何处理一个javascript对象数组,例如: 并通过将值相加来合并重复的键。为了得到这样的东西: 我尝试迭代并添加到新数组,但这没有用: 问题答案: 您应该使用属性将未找到的每个对象分配给结果。 如果找到它,则需要添加它。 另外,部分问题是您正在重用变量来引用的值,因此您失去了对该对象的引用。

  • 问题内容: 我想在数组中的每个索引处创建一个大小相同的数组。用Java做到这一点的最佳方法是什么? 例如,如果为5且值为boolean ,则数组应为: 问题答案: 您可以尝试以下方法: 手动数组填充的第二种方法:

  • 问题内容: 我有以下二维位图: 出于好奇,我想检查一下,如果它将使用整数而不是布尔值,它将占用多少空间。所以我检查了当前大小并得到 104 之后,我修改了 但仍然有 104 然后我决定看看仅用字符串我就能得到多少: ,仍然显示 104 这看起来很奇怪,因为我期望字符串列表列表浪费大量的内存,而不仅仅是布尔值。 显然我缺少有关getsizeof如何计算大小的信息。谁能解释我为什么得到这样的结果。 P

  • 问题内容: 我正在练习继承。 我有两个相似的类,我想将其同化为一个数组,因此我想将Object类用作超类,因为所有内容都是Object的子类。 因此,例如,我将T类和CT类放入一个名为all的数组中,如下所示: 我跳过了声明,因为那不是我的问题。 当我希望使用循环在数组内调用函数时,我真正的问题就变成了: T和CT分别涉及的类都具有beingShot方法,该方法是公共的。 Eclipse建议将它们