问题描述
我有两个形状相同的数组 (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.isin
和 np.isin1d
的各种组合,但无法将比较限制为从 array1
到 array2
中相应行的标量。提前感谢您的任何建议。
解决方法
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]]
输出:
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 都会在该位置创建一个额外的维度(即新轴)。 None
与 array1[...,None]
相同。
现在,比较 array1[:,:,None]
使用 numpy 的广播将 array1[...,:]
的每个元素与同一行中的 array1
的每个元素进行比较。输出有一个额外的维度。要检查 array2
的每个元素是否在 array1
的对应行中,只要查看它是否等于该行中 array2
的 any
个元素就足够了,因此 { {1}}。 python中的array2
指的是最后一个索引(这里是最后一个轴,对应于同一行的any(-1)
的列。