其中numpy,一些操作恢复正常,(R, 1)但一些操作返回(R,)。由于需要显式,这将使矩阵乘法更加乏味reshape。例如,给定一个矩阵M,如果我们想做numpy.dot(M[:,0], numpy.ones((1, R)))where Ris the number of rows (当然,同样的问题也会出现在列方面)。我们会得到matrices are not aligned错误,因为M[:,0]is in shape(R,)但numpy.ones((1, R))is in shape (1, R)。
numpy
(R, 1)
(R,)
reshape
M
numpy.dot(M[:,0], numpy.ones((1, R)))
R
matrices are not aligned
M[:,0]
numpy.ones((1, R))
(1, R)
所以我的问题是:
(R, 1)形状和形状有什么区别(R,)。我从字面上知道它是数字列表和列表列表,其中所有列表仅包含一个数字。只是想知道为什么不设计numpy成有利于形状(R, 1)而不是(R,)更容易的矩阵乘法。
上面的例子有更好的方法吗?没有像这样明确地重塑:numpy.dot(M[:,0].reshape(R, 1), numpy.ones((1, R)))
numpy.dot(M[:,0].reshape(R, 1), numpy.ones((1, R)))
你写,“我知道它是数字列表和列表列表,其中所有列表只包含一个数字”但这是一种无益的思考方式。
考虑 NumPy 数组的最佳方式是它们由两部分组成,一个是原始元素块的 数据缓冲区 ,另一个是描述如何解释数据缓冲区的 视图。
例如,如果我们创建一个包含 12 个整数的数组:
>>> a = numpy.arange(12) >>> a array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
然后a由一个数据缓冲区组成,安排如下:
a