python - 直观理解 Numpy nd 数组

标签 python arrays numpy data-structures

所以我已经阅读了手册 - 但结构仍然让我感到困惑。具体来说,它们之间有什么关系:

  • nd-array 和 Python 列表
  • nd-array 和 Python 字典
  • nd-array 和 Pandas DataFrame
  • nd-arrays 和 Numpy“结构化数组”?

此外,nd-array 是否就像列表序列一样?

“n 维”在哪里出现?因为它看起来就像一个矩阵,只是二维的。

谢谢!

最佳答案

  • ndarray 与 list:两者都可以保存元素的一维集合;然而,在 ndarray 中,元素通常都是相同类型(例如,64 位 float ),并且 numpy 提供了用于计算这些向量的运算符(和幕后优化)。例如,您可以(快速)通过 nda3 = nda1 + nda2 在 nda1 和 nda2 中添加元素。对于列表,您需要执行 lst3 = [a + b for (a, b) in zip(lst1, lst2)] 。另一方面,您可以轻松地插入和删除列表中的项目。 ndarray 专为数字向量的高性能计算而设计;列表专为对任意对象集合进行临时操作而设计。
  • ndarray 与字典:它们非常不同。字典允许您按名称从任意集合中选择对象; ndarrays 通常只保存数字,并且只允许通过索引号进行查找(除非你进入了重新排列,而你没有询问)。
  • ndarray 与 Pandas 数据框:数据框与多维 ndarray 有点相似,因为它们被设计为在每列中保存相似类型的数据。然而,数据帧的不同列通常会保存不同类型的数据,而多维 ndarray 中的所有元素通常都是相同类型的数字。此外,数据框提供跨行和列的基于名称的索引。我喜欢将数据帧视为一维 ndarray 的字典,即数据帧的每一列都像一个一维 ndarray,您可以按名称检索列,然后对其进行操作。但是 Pandas 提供了额外的索引功能,因此您还可以为每一行指定一个名称,然后根据行名称和列名称从表中提取元素。 Pandas 还提供了按元素操作的运算符(例如,将两列加在一起),类似于 numpy。但它通常通过匹配索引项而不是行/列号来实现这一点。因此 Pandas 中的数据操作速度较慢,但​​更可靠。
  • ndarray 与结构化数组:结构化数组有点像 Pandas 数据帧的行(每列中可以有不同的标准化数据类型)。但操作它们的语义更像是标准的 numpy 操作——在对其进行操作之前,您必须确保正确的数据位于数组中的正确位置。 (Pandas 会对表重新排序,以便行名在需要时匹配。)
  • ndarray 与列表序列:ndarray 的初始化和显示方式与列表序列类似,如果获取 2D 数组的第 n 个元素,您将得到一个列表(行)。但在内部,在 ndarray 中,每个元素都具有相同的数据类型(与列表不同),并且值在内存中紧密且均匀地打包。这允许处理器快速对所有值一起执行操作。列表更像是指向存储在其他地方的值的指针,并且列表或列表列表上的数学计算未优化。另外,您不能将 2D 或 3D 索引与列表列表一起使用(您必须说 lst[1][2][3],而不是 lst[1, 2, 3]),也不能轻松地按元素进行操作( lst1+lst2 不像 nda1+nda2 那样进行元素加法)。
  • 更高的维度:您可以创建具有任意维数的 ndarray。这有点类似于列表的列表。例如,这会生成一个 3D 数组:np.array([[[1, 2], [3, 4]], [[5, 6], [7,8]]])

关于python - 直观理解 Numpy nd 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46459441/

相关文章:

python - 如何获得 NumPy 数组的描述性统计信息?

python - PYODBC--未找到数据源名称且未指定默认驱动程序

python - 读取文件并转换为缓冲区对象或使用大对象函数

java - 字符串数组无法在索引[0]上分配

python - 列表和 numpy 数组之间的比较

python - np.where np.nan 的处理(NaN 评估为值 < 0)

python - 如何在数据框中的电话号码之前添加国家/地区代码(+852)

python - 如何在 Python 中对号码列表进行排序?

c - 将可变大小的多维 C 数组初始化为零

java - 将原始数组添加到链表