微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

numpy 测试每个值是否在另一个数组的行中

如何解决numpy 测试每个值是否在另一个数组的行中

我有两个形状相同的数组 (2500,9)。我试图找出最有效的方法来测试 array1 中一行中的每个值是否在 array2 中的相应行中。考虑以下简化示例:

>>> array1 = np.array([[1,2,3],[4,5,6],[3,8,9]])
>>> array2 = np.array([[0,4],[6,9]])
>>> comparison_func(array1,array2)
array([False,True,False],[False,True],True])

我可以通过迭代 array1 中的每个值并测试该值是否在 array2 中的相应行中来完成此操作。

>>> comp = []
>>> rows,columns = array1.shape
>>> np.array([array1[row,column] in array2[row,:]
              for row in range(rows)
              for column in range(columns)])
      .reshape(array1.shape)
array([[False,True]])

我想知道在 numpy.js 中是否有更有效的方法来做到这一点。我尝试了 np.isinnp.isin1d 的各种组合,但无法将比较限制为从 array1array2 中相应行的标量。提前感谢您的任何建议。

解决方法

Numpy 的 == 等于它:

>>> array1 = np.array([[1,2,3],[4,5,6],[3,8,9]])
>>> array2 = np.array([[0,4],[6,9]])
>>> print(array1 == array2)
[[False  True False]
 [False  True  True]
 [False  True  True]]
>>>

Numpy 的做法是将 __eq__ 函数更改为其他内容,即上述内容。

以下是一个示例,说明如何在 Python 类中实现这一点:

class array:
    def __init__(self,lst):
        self.lst = lst
    def __eq__(self,other):
        self.final = [[other[i][x] == y for x,y in enumerate(v)] for i,v in enumerate(self.lst)]
        return self.final
print(array([[1,9]]) == [[0,9]])

输出:

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

使用 numpy 广播并添加新轴来正确比较 IconicsDrawable(mContext).apply { icon = icon colorRes = R.color.blue_light backgroundColorRes = R.color.primary roundedCornersRes = R.dimen.card__rounded_corner paddingRes = R.dimen.card_icon_padding sizeRes = R.dimen.card_size }.toBitmap() 的每个元素与 array1 中相应行的所有元素(我假设您不关心元素在该行中的位置):

array2

输出:

(array1[...,None]==array2[:,None,:]).any(-1)

对比

[[False  True False]
 [False  True  True]
 [False  True  True]]

输出:

enter image description here

m2 对于这个输入似乎更快。


说明: 索引中的 #@U11-Forward's solution def m1(array1,array2): return [[array2[i][x] == y for x,v in enumerate(array1)] #@Ehsan's solution def m2(array1,array2): return (array1[...,:]).any(-1) in_ = {n:[np.random.randint(10,size=(n,100)),np.random.randint(10,100))] for n in [10,100,1000,10000]} None 的别名。无论您在哪里插入 np.newaxis,Numpy 都会在该位置创建一个额外的维度(即新轴)。 Nonearray1[...,None] 相同。

现在,比较 array1[:,:,None] 使用 numpy 的广播将 array1[...,:] 的每个元素与同一行中的 array1 的每个元素进行比较。输出有一个额外的维度。要检查 array2 的每个元素是否在 array1 的对应行中,只要查看它是否等于该行中 array2any 个元素就足够了,因此 { {1}}。 python中的array2指的是最后一个索引(这里是最后一个轴,对应于同一行的any(-1)的列。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。