[英]Python - Efficient way to find the largest area of a specific value in a 2D numpy array
[英]efficient way to check every value in a 2d python array
我有一個二維 numpy 值數組、一個 x 坐標列表和一個 y 坐標列表。 x 坐標從左到右增加,y 坐標從上到下增加。
例如:
a = np.random.random((3, 3))
a[0][1] = 9.0
a[0][2] = 9.0
a[1][1] = 9.0
a[1][2] = 9.0
xs = list(range(1112, 1115))
ys = list(range(1109, 1112))
輸出:
[[0.48148651 9. 9. ]
[0.09030393 9. 9. ]
[0.79271224 0.83413552 0.29724989]]
[1112, 1113, 1114]
[1109, 1110, 1111]
我想從二維數組中刪除大於 1 的值。我還想組合xs
和ys
列表以獲取保留點的所有坐標對的列表。
在這個例子中,我想刪除a[0][1], a[0][2], a[1][1], a[1][2]
並且我希望坐標對列表是
[[1112, 1109], [1112,1110], [1112, 1111], [1113, 1111], [1114, 1111]]
我已經能夠使用 double for
循環和if
語句來完成此操作:
a_values = []
point_pairs = []
for i in range(0, a.shape[0]):
for j in range(0, a.shape[1]):
if (a[i][j] < 1):
a_values.append(a[i][j])
point_pairs.append([xs[j], ys[i]])
print(a_values)
print(point_pairs)
輸出:
[0.48148650831317796, 0.09030392566133771, 0.7927122386213029, 0.8341355206494774, 0.2972498933037804]
[[1112, 1109], [1112, 1110], [1112, 1111], [1113, 1111], [1114, 1111]]
這樣做的更有效方法是什么?
您可以使用np.nonzero
來獲取您刪除的元素的索引:
mask = a < 1
i, j = np.nonzero(mask)
如果xs
和ys
是 numpy 數組,那么花哨的索引i
和j
可用於直接獲取它們的元素:
xs = np.array(xs)
ys = np.array(ys)
point_pairs = np.stack((xs[j], ys[i]), axis=-1)
point_pairs = np.stack((np.take(xs, j), np.take(ys, i)), axis=-1)
的其余元件a
是那些未包括的掩模:
a_points = a[mask]
或者:
i, j = np.nonzero(a < 1)
point_pairs = np.stack((np.take(xs, j), np.take(ys, i)), axis=-1)
a_points = a[i, j]
在這種情況下,您可以使用np.where
作為np.nonzero
別名。
筆記
如果您使用 numpy,則很少需要列表。 放置xs = np.array(xs)
,或者甚至只是將其初始化為xs = np.arange(1112, 1115)
更快更容易。
Numpy 數組通常應該通過單個索引進行索引: a[0, 1]
,而不是a[0][1]
。 對於您的簡單情況,行為恰好是相同的,但在一般情況下不會。 a[0, 1]
是原始數組的索引。 a[0]
是數組第一行的視圖,即一個單獨的數組對象。 a[0][1]
是該新對象的索引。 你碰巧很幸運,你得到了一個共享基本內存的視圖,所以分配本身是可見a
。 例如,如果您嘗試使用掩碼或花式索引,則情況並非如此。
在相關說明中,在數組中設置矩形條帶只需要一行: a[1:, :-1] = 9
。
我會寫你的例子是這樣的:
a = np.random.random((3, 3))
a[1:, :-1] = 9.0
xs = np.arange(1112, 1115)
ys = np.arange(1109, 1112)
i, j = np.nonzero(a < 1)
point_pairs = np.stack((xs[j], ys[i]), axis=-1)
a_points = a[i, j]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.