使用向量作为索引切片numpy矩阵

时间:2013-03-27 21:16:23

标签: python matlab vector matrix numpy

假设我们有一个大小为639乘668的矩阵 s ,这个矩阵完全由值-1组成。我们想要访问和替换28X28的一部分(例如,左上角),在该特定子矩阵周围留下-1的边界。对于该任务,我们初始化了以下向量 p (在MATLAB中),然后访问该部分:

>> s = -ones(639, 668);
>> p = 2:29;
>> section = s(p, p); %Size 28X28
>> size(section)

   ans =

   28    28

现在我们要在Numpy / Python中重写该代码,假设切片是等效的:

>>> import numpy as np
>>> s = -np.ones((639, 668))
>>> p = np.arange(1, 29)
>>> section = s[p, p]
>>> section.shape
(1, 28)

在这种情况下,无法使用相同的向量访问同一节(注意numpy中的索引基于0)。 ¿可以使用与MATLAB中类似的过程在numpy中访问该部分吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

您希望slice notation使用{{3}},而不是列表。

如果需要,可以使用a[1:29,1:29]创建slice对象,以获得更多matlab行为。

p = slice(1,29)

答案 1 :(得分:1)

您可以使用slice对象执行所需操作:

>>> p = slice(1, 29)
>>> section = s[p, p]
>>> section.shape
(28L, 28L)

您可以获得类似但不同的结果,广播您的索引数组:

>>> p = np.arange(1, 19)
>>> section_bis = s[p[:, None], p]
>>> section_bis.shape
(28L, 28L)

问题是你现在拥有的是一个副本,而不是原始数组的视图,因为你使用了花哨的索引:

>>> section_bis[:] = 0
>>> s
array([[-1., -1., -1., ..., -1., -1., -1.],
       [-1., -1., -1., ..., -1., -1., -1.],
       [-1., -1., -1., ..., -1., -1., -1.],
       ..., 
       [-1., -1., -1., ..., -1., -1., -1.],
       [-1., -1., -1., ..., -1., -1., -1.],
       [-1., -1., -1., ..., -1., -1., -1.]])

可是:

>>> section[:] = 0
>>>
array([[-1., -1., -1., ..., -1., -1., -1.],
       [-1.,  0.,  0., ..., -1., -1., -1.],
       [-1.,  0.,  0., ..., -1., -1., -1.],
       ..., 
       [-1., -1., -1., ..., -1., -1., -1.],
       [-1., -1., -1., ..., -1., -1., -1.],
       [-1., -1., -1., ..., -1., -1., -1.]])
相关问题