首页 > 解决方案 > 将样本存储在 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

这绝对不是那么方便。

标签: pythonnumpy

解决方案


性能取决于阵列的访问模式和内存布局。后者可以用 的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

推荐阅读