簡體   English   中英

檢查二維 python 數組中每個值的有效方法

[英]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 的值。我還想組合xsys列表以獲取保留點的所有坐標對的列表。

在這個例子中,我想刪除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)

如果xsys是 numpy 數組,那么花哨的索引ij可用於直接獲取它們的元素:

xs = np.array(xs)
ys = np.array(ys)
point_pairs = np.stack((xs[j], ys[i]), axis=-1)

您還可以使用np.takenp.take進行轉換:

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.

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