我对此感到好奇有一段时间了。我可以忍受这一点,但如果不采取足够的照顾,它总是会咬我,所以我决定将其发布在这里。假设以下示例(Numpy 版本 = 1.8.2):
a = array([[0, 1], [2, 3]])
print shape(a[0:0, :]) # (0, 2)
print shape(a[0:1, :]) # (1, 2)
print shape(a[0:2, :]) # (2, 2)
print shape(a[0:100, :]) # (2, 2)
print shape(a[0]) # (2, )
print shape(a[0, :]) # (2, )
print shape(a[:, 0]) # (2, )
我不知道其他人感觉如何,但结果对我来说感觉不一致。最后一行是列向量,而倒数第二行是行向量,它们应该具有不同的维度 - 在线性代数中它们确实如此! (第 5 行是另一个惊喜,但我暂时忽略它)。考虑第二个例子:
solution = scipy.sparse.linalg.dsolve.linsolve.spsolve(A, b) # solution of dimension (n, )
analytic = reshape(f(x, y), (n, 1)) # analytic of dimension (n, 1)
error = solution - analytic
现在误差的维度是 (n, n)。是的,在第二行中我应该使用 (n, ) 而不是 (n, 1),但为什么呢?我曾经经常使用 MATLAB,其中一维向量的维度为 (n, 1),linspace/arange 返回维度为 (n, 1) 的数组,并且从不存在 (n, )。但在 Numpy 中 (n, 1) 和 (n, ) 并存,并且有许多单独处理维度的函数:atleast、newaxis 和 reshape 的不同用途,但对我来说,这些函数更多的是混乱而不是帮助。如果一个数组打印成[1,2,3],那么直观上维度应该是[1,3]而不是[3,],对吗?如果 Numpy 没有 (n, ),我只能看到清晰度的提高,而不是功能的损失。
所以这背后一定有一些设计原因。我一直在寻找,但没有找到明确的答案或报告。有人可以帮助澄清这种困惑或为我提供一些有用的参考吗?非常感谢您的帮助。