0

假设您有两个长度相等的列表,由 int 列表组成。

y_hat = np.array([[0,1,2,6], [1,2,3,5]])
y_pred = np.array([[0, 3], [0, 4]])

您想将 y_pred 的每个列表与 y_hat 中的等效(相同索引)列表进行比较,如果 y_pred 的第 i 个元素在 y_hat 中,则返回一个 bool 列表:

result = np.array([[True, False], [False, False]]) # same shape of y_pred

你不能使用 np.isin(),因为它会返回:

result = np.isin(y_pred, y_hat)
# np.array([[True, True], [True, False]])

是否有一个矢量化的 .isin() 函数来避免 for 循环?

### Slow for loop
result = []
for y_h, y_p in zip(y_hat, y_pred):
   result_one = np.isin(y_p, y_h)
   result.append(result_one)

4

1 回答 1

1

不幸的是,np.isin不能以简单的方式使用。但是您可以尝试手动扫描所有值:

y_hat = np.array([[0,1,2,6], [1,2,3,5], [9,9,8,7]])
y_pred = np.array([[0,3], [0,4], [8,7]])
isin_vals = np.equal(y_hat[:, None], y_pred[:, :, None])

isin_vals
>>> array([[[ True, False, False, False],
            [False, False, False, False]],

           [[False, False, False, False],
            [False, False, False, False]],

           [[False, False,  True, False],
            [False, False, False,  True]]])

np.any(isin_vals, axis=2)
>>> array([[ True, False],
           [False, False],
           [ True,  True]])

不确定它是否像np.isin一维一样强大。

于 2022-02-15T19:29:27.997 回答