python - 将样本存储在 numpy 数组中的正确方法
问题描述
假设您有一个存储多元样本数据的矩阵(二维 numpy 数组)。使用每个样本的一行或每个样本的一列存储数据是否正确(速度和易用性)?例如
array([[x1, y1, ...], [x2, y2, ...], ..., [xN, yN, ...]])
或者
array([[x1, x2, ..., xN], [y1, y2, ..., yN], ...])
在 MATLAB 和 Octave 中,将每个样本视为列向量肯定更容易,但 numpy 没有给您任何指示。
例如。如果每个样本都存储为行向量,则以下是如何规范化一组样本的方法:
X - mean(X, axis = 0)
但是,如果将它们存储为列向量,则必须编写
(X.T - mean(X, axis = 1)).T
这绝对不是那么方便。
解决方案
性能取决于阵列的访问模式和内存布局。后者可以用 的order
参数设置np.array()
,其中:
指定数组的内存布局。如果 object 不是数组,则新创建的数组将按 C 顺序(主要行),除非指定了“F”,在这种情况下它将按照 Fortran 顺序(主要列)。
(如果 object 是一个数组,则有更多选项,因为可以保留布局。)
此外,正确的方法可能取决于您所依赖的库。例如,对于sklearn 中的线性回归,每个样本都需要一行。
[编辑]
按行存储样本也与pandas.DataFrame
对象兼容:
>>> CIRCLES = np.array([[1, 3.14],
... [2, 12.56],
... [3, 28.26]])
>>> DF = DataFrame(CIRCLES, columns=['r', 'S'])
>>> DF.mean()
r 2.000000
S 14.653333
dtype: float64
推荐阅读
- python - 如何在 Python 中按锻炼类型汇总时间(持续时间)和分组?
- python - 如何将 pandas 数据框中的字符串拆分为二元组,然后分解成新的行?
- java - 当我将其设置为变量时,它会更改值。有谁知道为什么?
- python - 从源代码构建python时如何摆脱输出文件中的abs_srcdir和abs_builddir字符串
- r - 在 R 中使用数据包中的多个数据帧
- rx-java2 - 什么是/如何为并行流动选择“预取”?
- mongodb - MongoDB 基于键:值将单个对象转换为对象数组
- templates - 是否可以将模板化的 blob 文本包含到 values.yaml 中?
- c - 二叉搜索树的前序中的叶节点
- c++ - 为什么模板的多个定义不会产生链接错误?