Numpy найти соглашение между столбцами в массиве - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть ярлыки от 'n' разных людей, которые оценили элементы 'm' (0 или 1), поэтому массив mxn.Например, 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]]

Я хочу посмотреть, по каким пунктам все «согласились», то есть все значения в строке совпадают.В этом примере ответом является [True, False, True, False].Я получил это, используя это:

np.logical_or(arr.sum(axis=1) == n, arr.sum(axis=1) == 0)

Вид хакерских.Какой лучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Я думаю, len(set(.)) - это в основном функция is_uniform, которую вы ищете:

[len(set(x)) == 1 for x in arr]

Обратите внимание, что это решение очень общее, оно не требует:

  1. одинаковое количество людей проголосовало за каждый элемент
  2. значения должны быть числовыми или любого конкретного типа
  3. дополнительный пакет поверх основного питона
0 голосов
/ 14 декабря 2018

Или используйте list comprehension, создавая элементы, длина которых равна количеству первого элемента i (поэтому, в основном, посмотрите, все ли они имеют одинаковое значение в i), если они не совпадают ссделайте их вместо False:

print([len(i)==i.tolist().count(i[0]) for i in arr])

Вывод:

[True, False, True, False]
0 голосов
/ 14 декабря 2018

Одной из альтернатив будет вычисление diff вдоль строк, а затем проверка, все ли diff равны 0;Это позволит убедиться, что все элементы в строке одинаковы (и могут отличаться от 0 и 1):

(np.diff(arr, axis=1) == 0).all(axis=1)
# array([ True, False,  True, False], dtype=bool)

Или, если у вас только 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...