python - 如何使用 Numpy/Scipy 编写一致的代码?

标签 python numpy scipy scikit-learn

我是 python 和 numpy/scipy 的新手。 Numpy 数组的设计和 numpy/scipy 中的广播规则有时非常有帮助,但对我来说仍然很痛苦。

我读过类似的内容

Numpy tries to keep the array in the lowest dimension.

某处。

这里有一些情况。

  1. 我想接收一个矩阵并计算其特征值并做一些事情。有时候,一维数组(例如,数组(1.0) - 来自 numpy 操作的结果),即传递给该函数的比例。我需要写一些类似的东西

    if (A.ndim < 2):
        A = sp.array([[A]])
    

    防止scipy.linalg.eig显示

    ValueError: expected square matrix

  2. 在解决一些机器学习问题时,我会写这样的内容

    n_samples, n_features = X.shape if X.ndim > 1 else (1, X.shape[0])
    

    我只需要编写额外的代码来获取样本和特征的数量并防止

    IndexError: tuple index out of range

    或者有时,当矩阵的行代表样本,矩阵的列代表特征时,我只需要特征的数量。我需要写一些类似的东西

    n_features = X.shape[1] if X.ndim > 2 else X.shape[0]
    

    或者进行一些预处理,例如

    if (X.ndim < 2):
        X = X[np.newaxis, :]
    

    让事情顺利进行。

  3. 有时我会写这样的东西

    sp.dot(weight.T, X.T - mu[:, sp.newaxis])
    

    一切看起来都很好,直到我发现 mu 可能是一个一维数组或一个 int 缩放器!然后出现异常

    TypeError: 'int' object is not subscriptable or

    IndexError: too many indices for array

差点让我发疯。

还有更多这样的情况......所有这些似乎都来自第一个引用中提到的规则,例如,当我期望一个矩阵,甚至是 1x1 的矩阵时,numpy 会尝试将其减少为 0-dim数组(即数组(1.0))。

我曾经是一个 matlab 用户,现在开始使用 Numpy/Scipy。除了简单且数学友好的 matlab 语法之外,matlab 的痛苦仍然更少。

我在sklearn包的源代码中阅读了一些代码,也有很多代码担心“这个东西是向量还是矩阵?”,“我们应该向它添加一个新轴吗?”。

减少编写本文的痛苦的最佳方法是什么?

最佳答案

np.atleast_2d 可能会解决您的所有问题。

即使最后一个也可以写成:

np.dot(weight.T, (X - np.atleast_2d(mu)).T)

或者也许

np.dot(X-np.atleast_2d(mu), weight)  # tested with (3,2),(2,3) arrays

matlab/numpy 兼容性问题已经存在很长时间了。至少有一个文档页面专门讨论该主题。

有一个 ndarray 子类,可确保它接触到的所有内容都是二维矩阵。当我开始使用 MATLAB 时,情况就是如此。当允许 3d 及更高版本时,这是一件大事。但经验丰富的 numpy 用户不鼓励使用它。有一些问题,海报被 np.matrix 弄乱了。

我很早就在 MATLAB 中了解到,保持维度正确是调试的最重要部分。我养成了定义测试矩阵的习惯,其形状有助于识别不匹配(以及转置等操作的需要)。这同样适用于 numpy

MATLAB 用户总是想知道“这是列向量还是行向量?”,并抛出 x.' 表达式。 numpy 为您提供了第三种选择 - 一维向量。

关于确保数组具有 n 维存在很多问题。查找np.atleast_xxx函数。查找 ...[None,:] 语法。对于reshape(n,1)reshape(...-1)np.sum 等函数接受 keepdims 参数。


np.atleast_2d 的代码是:

def atleast_2d(*arys):
    res = []
    for ary in arys:
        ary = asanyarray(ary)
        if len(ary.shape) == 0 :
            result = ary.reshape(1, 1)
        elif len(ary.shape) == 1 :
            result = ary[newaxis,:]
        else :
            result = ary
        res.append(result)
    if len(res) == 1:
        return res[0]
    else:
        return res

关于python - 如何使用 Numpy/Scipy 编写一致的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35940600/

相关文章:

python - 写入文件时如何舍入 numpy 堆叠数组?

python - 如何将数组转换为列表?

python - Pandas :分组观察的加权中位数

python - 有没有更快版本的 numpy.random.shuffle?

Python:联合上的交集

python - 是否可以使用 k-means 在 scikit/sklearn learn 中使用的 K++ 初始化过程?

python - 将高斯拟合到测量峰值

python - 如何使用 xlwings 从 Python 调用 Excel 宏?

python - 无法从 python 中的 websocket 导入 WebSocketApp

python - Jython 有 GIL 吗?