3

假设我们有一个大小为 639 x 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 中访问该部分吗?

提前致谢。

4

2 回答 2

1

您想使用切片表示法,如 中a[1:29,1:29],而不是列表。

如果你愿意,你可以创建一个slice对象p = slice(1,29)来获得更多的 matlab 行为。

In [9]: a = -np.ones((10,10))

In [10]: a
Out[10]: 
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., -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., -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.]])

In [11]: a[1:4,1:4] = 9

In [12]: a
Out[12]: 
array([[-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1.,  9.,  9.,  9., -1., -1., -1., -1., -1., -1.],
       [-1.,  9.,  9.,  9., -1., -1., -1., -1., -1., -1.],
       [-1.,  9.,  9.,  9., -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.],
       [-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.]])


In [13]: p = slice(1,4)

In [14]: a[p,p]
Out[14]: 
array([[ 9.,  9.,  9.],
       [ 9.,  9.,  9.],
       [ 9.,  9.,  9.]])
于 2013-03-27T21:28:36.063 回答
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.]])
于 2013-03-27T21:30:09.587 回答