簡體   English   中英

使用向量作為索引切片numpy矩陣

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM