2017-02-05 7 views
1

Я пытаюсь получить все индексы строк матрицы (A), которая содержит элемент nd.Получение индексов строк матрицы, которая удовлетворяет условию в Python

Размер A 4M * 4, для этой операции требуется ~ 12 секунд.

Ссылка на файл: data

# Download the file named elementconnectivity before running this small script 


A=np.loadtxt('elementconnectivity') 
A=A.astype(int) 
nd=1103 
v=[i for i in range(len(A)) if nd in A[i]] 

Есть ли более быстрый способ для достижения этой цели?

+0

Пожалуйста, поделитесь образцами значений 'A' и' nd', если сможете. Это даст нам больше информации о том, что вы делаете, и какое решение будет лучше соответствовать. –

+0

Здравствуйте, Vivek. Я дал образцы значений. – Mechanician

ответ

1

Поскольку вы используете numpy в любом случае, это ускоряет много с некоторыми более Numpy функций. Ваш текущий метод в моей системе:

%timeit v=[i for i in range(len(A)) if nd in A[i]] 
1 loop, best of 3: 4.23 s per loop 

Вместо этого около 40x быстрее:

%timeit v = np.where(np.sum((A == nd), axis=1) > 0) 
10 loops, best of 3: 92.2 ms per loop 

Вы также можете посмотреть на np.in1d, который похож на A == nd я использовал выше, но можно сравнить с (что-то вроде A == nd1 или nd2 или nd3).

+0

Спасибо, это работает – Mechanician

+0

Я нашел, что это занимает гораздо меньше времени v = np.where (A == nd) [0] – Mechanician

+0

Это не даст вам то, что вы ищете! Это дает вам все элементы, где A == nd. Но вы хотели знать, какие строки имеют любой элемент == nd. Вот почему вы должны суммировать его по одной оси. – VBB

0

я думает, лучший способ сделать это состоит в использовании итераторов вместо списков

idxs = (i for i in xrange(len(A)) if nd in A[i]) 
idxs.next() 
+0

получил ошибку: <объект-генератор при 0x000007FFFEFFC3A8> – Mechanician

+0

, что не является ошибкой, является ссылкой на генератор. [generatorators] (https://wiki.python.org/moin/Generators) не дают результата сразу, а вместо этого каждый раз, когда вам нужно значение, вы используете метод ** next ** для его получения. –

+0

Не могли бы вы объяснить, как мне вернуть значения в массиве, прошу прощения, я не знаю об этом – Mechanician