假設我有以下 4 x 3 x 3 陣列,
array([[[-2, -2, -2],
[-2, -2, -2],
[-2, -2, -2]],
[[-2, -2, -2],
[-2, -2, -2],
[-2, -2, -2]],
[[-2, -2, 71],
[-1, -1, -1],
[71, -1, 52]],
[[-2, -2, -2],
[-2, -2, -2],
[-2, -2, -2]]])
我想通過以下標準過濾這樣的陣列:
將每個 3 x 3 陣列視為一個塊。如果這個塊中的所有元素都等于-2,我們應該切割整個塊,所以目標陣列看起來像這樣(1 x 3 x 3):
array([[[-2, -2, 71],
[-1, -1, -1],
[71, -1, 52]]])
我只能想出一個帶有顯式if條件和for回圈的蠻力解決方案,但它不起作用。誰能分享一個更好的方法?
您可以通過以下命令重新創建原始陣列
array = np.array([[-2,-2,-2,-2,-2,-2,-2,-2,-2],
[-2,-2,-2,-2,-2,-2,-2,-2,-2],
[-2,-2,71,-1,-1,-1,71,-1,52],
[-2,-2,-2,-2,-2,-2,-2,-2,-2]])
newarr = array.reshape(4,3,3)
uj5u.com熱心網友回復:
如果您希望沿軸 0 的陣列始終為特定值,例如 -2 或 872385 等,則其他答案很好。
如果您想要更通用的東西,想要過濾掉任何包含單個值的陣列,您可以按等級過濾陣列。
由于任何單值矩陣的秩為 1,您可以按以下方式過濾rank != 1:
In [2]: x[np.linalg.matrix_rank(x) != 1]
Out[2]:
array([[[-2, -2, 71],
[-1, -1, -1],
[71, -1, 52]]])
這適用于沿軸 0 填充相同值的任何矩陣。另一個例子:
In [4]: x
Out[4]:
array([[[ 5, 5, 5],
[ 5, 5, 5],
[ 5, 5, 5]],
[[-2, -2, -2],
[-2, -2, -2],
[-2, -2, -2]],
[[-2, -2, 71],
[-1, -1, -1],
[71, -1, 52]],
[[99, 99, 99],
[99, 99, 99],
[99, 99, 99]]])
In [5]: x[np.linalg.matrix_rank(x) != 1]
Out[5]:
array([[[-2, -2, 71],
[-1, -1, -1],
[71, -1, 52]]])
uj5u.com熱心網友回復:
您可以這樣做,它使用過濾器陣列功能和all()NumPy 中的函式:
filterarr = []
for arr in newarr:
if np.all(arr==-2):
filterarr.append(False)
else:
filterarr.append(True)
newarr = newarr[filterarr]
print(newarr)
uj5u.com熱心網友回復:
您可以使用np.where:
data[np.where(np.any(data != -2, axis=-1))]
給定陣列 as data,輸出為:
[[-2 -2 71]
[-1 -1 -1]
[71 -1 52]]
uj5u.com熱心網友回復:
您可以選擇否定所有沿第 2 軸和第 3 軸的陣列等于-2:
>>> arr
array([[[-2, -2, -2],
[-2, -2, -2],
[-2, -2, -2]],
[[-2, -2, -2],
[-2, -2, -2],
[-2, -2, -2]],
[[-2, -2, 71],
[-1, -1, -1],
[71, -1, 52]],
[[-2, -2, -2],
[-2, -2, -2],
[-2, -2, -2]]])
>>> ~(arr == -2).all(axis=(1,2))
array([False, False, True, False])
并在第一個軸上使用布爾索引:
>>> arr[~(arr == -2).all(axis=(1,2)), ...]
array([[[-2, -2, 71],
[-1, -1, -1],
[71, -1, 52]]])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/448663.html
