Python 使用第二个数组在索引处使用值屏蔽嵌套数组

Python 使用第二个数组在索引处使用值屏蔽嵌套数组,python,numpy,Python,Numpy,我有一个带有一些值的嵌套数组。我有另一个数组,两个数组的长度相等。我想得到一个输出,其中我有一个嵌套数组1和0,这样它就是1,第二个数组中的值等于该嵌套数组中的值 我已经查看了现有的堆栈溢出问题,但无法构造一个答案 masks_list = [] for i in range(len(y_pred)): mask = (y_pred[i] == y_test.values[i]) * 1 masks_list.append(mask) masks = np.array(masks

我有一个带有一些值的嵌套数组。我有另一个数组,两个数组的长度相等。我想得到一个输出,其中我有一个嵌套数组
1
0
,这样它就是
1
,第二个数组中的值等于该嵌套数组中的值

我已经查看了现有的堆栈溢出问题,但无法构造一个答案

masks_list = []
for i in range(len(y_pred)):
    mask = (y_pred[i] == y_test.values[i]) * 1
    masks_list.append(mask)
masks = np.array(masks_list);
从本质上说,这是我目前拥有的代码,它是有效的,但我认为这可能不是最有效的方法

YPRED:
[[4 0 1 2 3 5 6]
 [0 1 2 3 5 6 4]]

YTEST:
8    1
5    4

Masks:
[[0 0 1 0 0 0 0]
 [0 0 0 0 0 0 1]]

另一个很好的解决方案,代码行更少

a = set(y_pred).intersection(y_test)
f = [1 if i in a else 0 for i, j in enumerate(y_pred)]
之后,您可以按如下方式检查性能:

import time
from time import perf_counter as pc

t0=pc()    
a = set(y_pred).intersection(y_test)
f = [1 if i in a else 0 for i, j in enumerate(y_pred)]
t1 = pc() - t0

t0=pc()
for i in range(len(y_pred)):
    mask = (y_pred[i] == y_test[i]) * 1
    masks_list.append(mask)
t2 = pc() - t0

val = t1 - t2
一般来说,这意味着如果值为正,则第一个解的速度较慢。 如果您使用的是np.array而不是list,则可以尝试执行以下操作:

Idea(最小循环):比较数组和嵌套数组:

masks = np.equal(y_pred, y_test.values)
你也可以看看:


你能给出一些测试数组和内部测试数组吗?如果成功的话,这将是一个很好的解决方案。我想你也可以用map完成。发布你想要的I/O示例?添加了一些示例I/O。所以“嵌套数组”指的是2d数组(在你的示例形状(2,7)中)。是的。这就是我的意思。np.array是不可破坏的。这条评论是根据我的回答还是@Jaja?你的评论,在这一行:
a=set(y\u pred)。intersection(y\u test)
我知道你得到的是np.array而不是list。你能试试吗
masks = np.equal(y_pred, y_test.values)
np.array_equal(A,B)  # test if same shape, same elements values
np.array_equiv(A,B)  # test if broadcastable shape, same elements values
np.allclose(A,B,...) # test if same shape, elements have close enough values