Python Numpy查找数组中列之间的一致性
我有来自“n”个不同的人的标签,他们对“m”项进行评级(0或1),因此是一个m x n数组。例如,3人对4个项目进行评级:Python Numpy查找数组中列之间的一致性,python,arrays,numpy,Python,Arrays,Numpy,我有来自“n”个不同的人的标签,他们对“m”项进行评级(0或1),因此是一个m x n数组。例如,3人对4个项目进行评级: arr = np.asarray([[1,1,1], [1,1,0], [0,0,0], [0, 1, 0]]) print(arr) >>> [[1 1 1] [1 1 0] [0 0 0] [0 1 0]] 我想看看每个人都“同意”哪些项目,即行中的所有值都相同。在这个例子中,答案是[真,假,真,假]。我用这个让它工作起来: np.logica
arr = np.asarray([[1,1,1], [1,1,0], [0,0,0], [0, 1, 0]])
print(arr)
>>>
[[1 1 1]
[1 1 0]
[0 0 0]
[0 1 0]]
我想看看每个人都“同意”哪些项目,即行中的所有值都相同。在这个例子中,答案是[真,假,真,假]。我用这个让它工作起来:
np.logical_or(arr.sum(axis=1) == n, arr.sum(axis=1) == 0)
有点黑。做这件事的更好方法是什么?一种替代方法是沿行计算
diff
,然后检查所有diff
s是否等于0;这将确保一行中的所有元素都相同(并且可以不同于0和1):
或者,如果只有0和1,则:
(arr == 1).all(1) | (arr == 0).all(1)
# array([ True, False, True, False], dtype=bool)
arr.all(1) | ~arr.any(1)
# array([ True, False, True, False], dtype=bool)
我认为len(set(.))
基本上就是您正在寻找的is_uniform
函数:
[len(set(x)) == 1 for x in arr]
请注意,此解决方案非常通用,不需要:
或者使用
列表理解
使元素的长度等于i
的第一个元素的计数(因此基本上看它们在i
中是否都是相同的值),如果它们与条件不匹配,则改为假
:
print([len(i)==i.tolist().count(i[0]) for i in arr])
输出:
[True, False, True, False]
arr.sum(轴=1)%n==0也起作用。这很顺利。如果arr是一个列表列表(每个用户一个评级列表),您将如何修改它以使其工作?你现在不能像遍历numpy数组那样遍历这些行。正如我修改后的答案所提到的,这个解决方案不仅很流畅,而且非常通用:)这是否回答了你的后续问题?你的解决方案假设arr是一个iterable,每个对象都是Hmm的集合,你能举个例子更新你的问题吗?考虑到问题的本质,很难想象arr不是一个iterable,我是否认为我已经解决了这个问题:在这种情况下,您必须使用zip()将n个列表中的每一行转换为1个元组,然后它才能工作。
[True, False, True, False]