[英]Removing nan entries from a 2-D Numpy array without for loops
[英]removing entries from a numpy array
我有一個多維的numpy數組形狀(4,2000)。 數組中的每一列都是4D元素,其中前兩個元素表示2D位置。
現在,我有一個與二進制圖像形狀相同的圖像蒙版,告訴我哪些像素有效或無效。 掩碼中的條目0突出顯示無效的像素。
現在,我想做的是基於這個掩碼過濾我的第一個數組,即刪除第一個數組中的位置元素對應於圖像中的無效像素的條目。 這可以通過查找掩碼中的相應條目並標記要刪除的那些列來完成,這些列對應於掩碼中的0條目。
所以,像:
import numpy as np
# Let mask be a 2D array of 0 and 1s
array = np.random.rand(4, 2000)
for i in range(2000):
current = array[:, i]
if mask[current[0], current[1]] <= 0:
# Somehow remove this entry from my array.
如果可能的話,我想在沒有循環的情況下這樣做,因為我的代碼不完整。
您可以從array
選擇x和y坐標,如下所示:
xarr, yarr = array[0, :], array[1, :]
然后形成一個布爾形狀的數組(2000,),無論掩碼是1,它都是True:
idx = mask[xarr, yarr].astype(bool)
mask[xarr, yarr]
正在使用所謂的“整數數組索引” 。 這意味着idx
的ith
元素等於mask[xarr[i], yarr[i]]
。
然后從array
選擇那些列:
result = array[:, idx]
import numpy as np
mask = np.random.randint(2, size=(500,500))
array = np.random.randint(500, size=(4, 2000))
xarr, yarr = array[0, :], array[1, :]
idx = mask[xarr, yarr].astype(bool)
result = array[:, idx]
cols = []
for i in range(2000):
current = array[:, i]
if mask[current[0], current[1]] > 0:
cols.append(i)
expected = array[:, cols]
assert np.allclose(result, expected)
我不確定我是否正確地閱讀了這個問題。 讓我們再試一次!
您有一個包含2維的數組,並且您希望刪除所有具有屏蔽數據的列。 如果我讀錯了,請再次道歉。
import numpy.ma as ma
a = ma.array((([[1,2,3,4,5],[6,7,8,9,10]]),mask=[[0,0,0,1,0],[0,0,1,0,0]])
a[:,-a.mask.any(0)] # this is where the action happens
a.mask.any(0)標識所有被屏蔽到布爾數組中的列。 它被否定(' - '符號),因為我們想要反轉,然后它使用該數組通過索引刪除所有被屏蔽的值。
這給了我一個數組:
[[1 2 5],[6 7 10]]
換句話說,數組已經刪除了所有具有屏蔽數據的列。 希望這次我做對了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.