我正在嘗試使用邏輯索引提取子陣列,
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]])
a
Out[45]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])
b = np.array([False, True, False, True])
a[b, b]
Out[49]: array([ 6, 16])
python 計算 a 的每個元素在 b 中的邏輯索引。但是在matlab中你可以做類似的事情
>> a = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
a =
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
>> b = [2 4]
b =
2 4
>> a(b, b)
ans =
6 8
14 16
我怎樣才能在python中實作相同的結果而不做,
c = a[:, b]
c[b,:]
Out[51]:
array([[ 6, 8],
[14, 16]])
uj5u.com熱心網友回復:
Numpy 支持邏輯索引,盡管它與您在 MATLAB 中熟悉的有點不同。要獲得您想要的結果,您可以執行以下操作:
a[b][:,b] # first brackets isolates the rows, second brackets isolate the columns
Out[27]:
array([[ 6, 8],
[14, 16]])
在您了解您的情況發生了什么之后,將了解更“numpy”的方法。
b = np.array([False, True, False, True])類似于b=np.array([1,3])并且對我來說更容易解釋。撰寫a[[1,3],[1,3]]時會發生什么是 numpy 板條箱 (2,1) 形狀陣列,并放置a[1,1]在該[0]位置和a[3,3]第二個位置。要創建形狀 (2,2) 的輸出,索引必須具有相同的維度。因此,以下將得到您的結果:
a[[[1,1],[3,3]],[[1,3],[1,3]]]
Out[28]:
array([[ 6, 8],
[14, 16]])
說明:
索引陣列是:
temp_rows = np.array([[1,1],
[3,3]])
temp_cols = np.array([[1,3],
[1,3])
兩個陣列的維度都是 (2,2),因此,numpy 將創建形狀為 (2,2) 的輸出。然后,它放置a[1,1]在位置 [0,0]、位置a[1,3][0,1]、a[3,1]位置 [1,0] 和a[3,3]位置 [1,1]。這可以擴展為任何形狀,但出于您的目的,您需要 (2,2) 的形狀
弄清楚這一點后,您可以利用以下事實使事情變得更簡單到 MATLAB 操作。這意味著通過使用:
temp_rows = np.array([[1],[3]])
temp_cols = np.array([1,3])
你可以做:
a[[[1],[3]], [1,3])
Out[29]:
array([[ 6, 8],
[14, 16]])
uj5u.com熱心網友回復:
你可以np.ix_在這里使用。
a[np.ix_(b, b)]
# array([[ 6, 8],
# [14, 16]])
輸出回傳np.ix_
>>> np.ix_(b, b)
(array([[1],
[3]]),
array([[1, 3]]))
uj5u.com熱心網友回復:
您可以使用 b 向量的外積。您可以使用總和從 True 值的數量中獲得新的維度。
import numpy as np
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]])
b = np.array([False, True, False, True])
#
M = np.outer(b, b)
new_dim = b.sum()
new_shape = (new_dim, new_dim)
selection = a[M].reshape(new_shape)
結果看起來像
[[ 6 8]
[14 16]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/444852.html
標籤:Python 数组 麻木的 索引 numpy-ndarray
下一篇:`mapply`的奇怪行為[R]
