[英]Slice numpy matrix using vectors as indices
假設我們有由668尺寸639的矩陣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中訪問該部分嗎?
提前致謝。
您想要使用切片表示法 ,如a[1:29,1:29]
,而不是列表。
如果需要,可以使用p = slice(1,29)
創建slice
對象以獲得更多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.]])
您可以使用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.]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.