Примечание - это, вероятно, частично совпадает с ответом @ Mad; Я оставлю это на случай, если альтернативное объяснение устранит некоторую путаницу.
In [32]: numList = [[0, 32, 84, 93, 1023, -1], [0, 23, 33, 45, -1, -1], [0, 10, 15, 21, 2
...: 4, 25], [0, 23, -1, -1, -1, -1], [0 , 13, 33, 34, -1, -1]]
...: numArray = np.array(numList)
In [33]: numArray
Out[33]:
array([[ 0, 32, 84, 93, 1023, -1],
[ 0, 23, 33, 45, -1, -1],
[ 0, 10, 15, 21, 24, 25],
[ 0, 23, -1, -1, -1, -1],
[ 0, 13, 33, 34, -1, -1]])
количество контактных площадок в строке:
In [34]: np.sum(numArray==-1, axis=1)
Out[34]: array([1, 2, 0, 4, 2])
количество не-контактных площадок в строке:
In [35]: np.sum(numArray!=-1, axis=1)
Out[35]: array([5, 4, 6, 2, 4])
Я не знаю, если предположить, что все значения площадок находятся в конце, делает это более эффективным или нет. Выборка немного мала, чтобы обеспечить хорошее время. (выше) (и предполагая заполнение хвостом) мы могли бы выбрать случайный индекс для каждой строки:
In [46]: [np.random.choice(i) for i in Out[35]]
Out[46]: [1, 2, 1, 0, 1]
In [47]: numArray[np.arange(numArray.shape[0]), [np.random.choice(i) for i in Out[35]]]
Out[47]: array([93, 45, 21, 23, 13])
В подсказке к @Mad randint
принимает список / массив значений диапазона, choice
понимание можно заменить на:
In [49]: np.random.randint(Out[35])
Out[49]: array([3, 1, 2, 1, 1])
In [50]: numArray[np.arange(numArray.shape[0]), np.random.randint(Out[35])]
Out[50]: array([ 0, 23, 24, 0, 0])