Я хочу выбрать только определенные строки из массива NumPy на основе значения во втором столбце. Например, этот тестовый массив имеет целые числа от 1 до 10 во втором столбце.Выбор строк из NumPy ndarray
>>> test = numpy.array([numpy.arange(100), numpy.random.randint(1, 11, 100)]).transpose()
>>> test[:10, :]
array([[ 0, 6],
[ 1, 7],
[ 2, 10],
[ 3, 4],
[ 4, 1],
[ 5, 10],
[ 6, 6],
[ 7, 4],
[ 8, 6],
[ 9, 7]])
Если бы я хотел только те строки, где второе значение равно 4, то легко:
>>> test[test[:, 1] == 4]
array([[ 3, 4],
[ 7, 4],
[16, 4],
...
[81, 4],
[83, 4],
[88, 4]])
Но как я могу добиться того же результата, когда есть больше чем один хотел значение?
Желаемый список может быть произвольной длины. Например, я могу хотеть все строки, где второй столбец либо 2, 4 или 6:
>>> wanted = [2, 4, 6]
Единственный способ, который я придумал, чтобы использовать список понимание, а затем преобразовать это обратно в массив и, кажется, слишком запутанным, хотя он работает:
>>> test[numpy.array([test[x, 1] in wanted for x in range(len(test))])]
array([[ 0, 6],
[ 3, 4],
[ 6, 6],
...
[90, 2],
[91, 6],
[92, 2]])
есть ли лучший способ сделать это в самом NumPy, что мне не хватает?
Это решение проходит через массив len (разыскивается) раз. Как правило, быстрее пройти через массив за один проход. – EOL
Спасибо Amnon. Это решение, которое я решил принять.Я думаю, что это понятно для понимания и примерно в 20 раз быстрее моего первоначального решения. –
Что делать, если я хочу выбрать определенные строки с условными значениями в столбце? Например, я хочу выбрать все строки, чей столбец 1 имеет значения в диапазоне от 5 до 10. Например. 'test [test [:, 1]> 4 & test [:, 1] <8]'. – Shyamkkhadka