У меня есть трехмерный массив, заполненный целыми числами от 0 до N. Мне нужен список индексов, соответствующих тому, где массив равен 1, 2, 3, ... N. Я могу сделать это с помощью np.where следующим образом :более быстрая альтернатива numpy.where?
N = 300
shape = (1000,1000,10)
data = np.random.randint(0,N+1,shape)
indx = [np.where(data == i_id) for i_id in range(1,data.max()+1)]
, но это довольно медленно. В соответствии с этим вопросом fast python numpy where functionality? должно быть возможно ускорить поиск индекса довольно много, но я не смог перенести предложенные там методы на проблему получения фактических индексов. Какой был бы лучший способ ускорить выполнение вышеуказанного кода?
В качестве дополнения: Я хочу, чтобы хранить индексы позже, для которых имеет смысл использовать np.ravel_multi_index, чтобы уменьшить размер от экономии 3 индексов только 1, то есть с помощью:
indx = [np.ravel_multi_index(np.where(data == i_id), data.shape) for i_id in range(1, data.max()+1)]
который ближе к Функция поиска Matlab. Может ли это быть напрямую включено в решение, которое не использует np.where?
Это не критика python или numpy - на самом деле, numpy сама использует скомпилированный Fortran для разбора отдельных операций - эти операции, однако, являются подмножеством бесконечных возможных задач обработки, которые вы, возможно, захотите реализовать. Таким образом, для довольно специфических проблем в таких библиотеках не всегда бывают быстрые подходы, такие как полные, на что они нацелены; для наилучших подходов могут потребоваться отдельные шаги, которые могут быть чрезмерными. Для некоторых проблем вы можете столкнуться, возможно, стоит реализовать их самостоятельно на языке более низкого уровня (например, C++ или Fortran) и скомпилировать собственные расширения. – JArkinstall
Это может быть правдой, но уже есть множество оптимизированных реализаций более низкого уровня для конкретных проблем в numpy, scipy, pandas и связанных с ними пакетах. Часто, отступая назад и думая о том, какой основной тип проблемы вы столкнулись, становится ясно, что один из этих инструментов уже решает вашу проблему. Например, я думаю, что даже пользовательский код C не будет намного быстрее для этой проблемы, чем предлагаемое ниже решение '' scipy.sparse': каждая значительная операция здесь уже выполняется эффективно в C. – jakevdp