Numpy:为什么(2,1)数组和垂直矩阵切片的差异不是(2,1)数组

时间:2016-09-26 15:06:07

标签: python arrays numpy

请考虑以下代码:

>>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)向量。

然而,我不是说这是应该如何做的,而其他一切都是愚蠢的。如果有人能提供一些我能记住的逻辑,我会很高兴,所以这样的事情不会在我的代码中产生错误。

请注意,我不是在问我如何实现我想要的(我可以重塑y),但我希望能够更深入地理解为什么Python / Numpy会起作用。也许我在做一些概念错误的事情?

2 个答案:

答案 0 :(得分:1)

查看$('.title-overlay').hover(function(){ if($('.wmg-container3').hasClass('open')){ $(this).removeClass('title-hover') }else{ $(this).addClass('title-hover') } }) 的形状。它是y; 1D。源数组是(2,2),但您选择的是一列。 (2,)不仅会选择列,还会删除该单例维度。

所以我们有2个操作,这个形状的变化:

M[:,0]

有多种方法可以确保M[:,0]: (2,2) => (2,) x - y: (2,1) (2,) => (2,1), (1,2) => (2,2) 具有形状(2,1)。带有列表/向量的索引y;带有切片的索引M[:,[0]]。添加维度M[:,:1]

还要考虑M[:,0,None]M[0,:]时会发生什么。

答案 1 :(得分:1)

numpy.array索引使得任何位置的单个值都会折叠该维度,而切片会保留该维度,即使切片只有一个元素宽度。对于任何数量的维度,这都是完全一致的:

>> 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)

请注意,每次使用单个数字时,该维度都会被删除。

您可以使用numpy.matrix获取您期望的语义,其中两个单个索引返回0阶数组,所有其他类型的索引返回矩阵

>> 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时,您的示例可以正常工作:

>> x = numpy.matrix([[1],[3]])
>> M = numpy.matrix([[1,2],[3,4]])
>> y = M[:, 0]
>> x - y
matrix([[0],
        [0]])