numpy:为什么(2,1)数组和垂直矩阵切片的差不是(2,1)数组 [英] Numpy: Why is difference of a (2,1) array and a vertical matrix slice not a (2,1) array
问题描述
考虑以下代码:
>>x=np.array([1,3]).reshape(2,1)
array([[1],
[3]])
>>M=np.array([[1,2],[3,4]])
array([[1, 2],
[3, 4]])
>>y=M[:,0]
>>x-y
array([[ 0, 2],
[-2, 0]])
从直觉上我认为这应该给出零的(2,1)向量.
I would intuitively feel this should give a (2,1) vector of zeros.
但是,我并不是说这是应该做的事情,其他所有事情都是愚蠢的.如果有人可以提供一些我能记住的逻辑,那么这样的事情就不会在我的代码中不断产生错误,我将非常乐意.
I am not saying, however, that this is how it should be done and everything else is stupid. I would simply love if someone could offer some logic that I can remember so things like this don't keep producing bugs in my code.
请注意,我并不是在问我如何实现自己想要的(我可以重塑y),而是希望对Python/Numpy为何能如此工作有更深入的了解.也许我在概念上做错了什么?
Note that I am not asking how I can achieve what I want (I could reshape y), but I am hoping to get some deeper understanding of why Python/Numpy works as it does. Maybe I am doing something conceptually wrong?
推荐答案
numpy.array
索引使得在任何位置上的单个值都会使该维折叠,而切片将保留该维,即使切片只有一个元素宽.对于任何数量的尺寸,这都是完全一致的:
numpy.array
indexes such that a single value in any position collapses that dimension, while slicing retains it, even if the slice is only one element wide. This is completely consistent, for any number of dimensions:
>> A = numpy.arange(27).reshape(3, 3, 3)
>> A[0, 0, 0].shape
()
>> A[:, 0, 0].shape
(3,)
>> A[:, :, 0].shape
(3, 3)
>> A[:1, :1, :1].shape
(1, 1, 1)
请注意,每次使用单个数字时,该尺寸都会被删除.
Notice that every time a single number is used, that dimension is dropped.
您可以使用numpy.matrix
获得期望的语义,其中两个单个索引返回一个0阶数组,所有其他类型的索引返回矩阵
You can obtain the semantics you expect by using numpy.matrix
, where two single indexes return a order 0 array and all other types of indexing return matrices
>> M = numpy.asmatrix(numpy.arange(9).reshape(3, 3))
>> M[0, 0].shape
()
>> M[:, 0].shape # This is different from the array
(3, 1)
>> M[:1, :1].shape
(1, 1)
您的示例在使用numpy.matrix
时可以按预期工作:
Your example works as you expect when you use numpy.matrix
:
>> x = numpy.matrix([[1],[3]])
>> M = numpy.matrix([[1,2],[3,4]])
>> y = M[:, 0]
>> x - y
matrix([[0],
[0]])
这篇关于numpy:为什么(2,1)数组和垂直矩阵切片的差不是(2,1)数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!