假设我们有一个大小为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中访问该部分吗?
提前致谢。
答案 0 :(得分:1)
答案 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.]])