我是 python 和 numpy/scipy 的新手。 Numpy 数组的设计和 numpy/scipy 中的广播规则有时非常有帮助,但对我来说仍然很痛苦。
我读过类似的内容
Numpy tries to keep the array in the lowest dimension.
某处。
这里有一些情况。
我想接收一个矩阵并计算其特征值并做一些事情。有时候,一维数组(例如,数组(1.0) - 来自 numpy 操作的结果),即传递给该函数的比例。我需要写一些类似的东西
if (A.ndim < 2): A = sp.array([[A]])
防止
scipy.linalg.eig
显示ValueError: expected square matrix
在解决一些机器学习问题时,我会写这样的内容
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, :]
让事情顺利进行。
有时我会写这样的东西
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/