The following Python code appears to be very long winded when coming from a Matlab background
>>> a = [1, 2, 3, 1, 2, 3] >>> [index for index,value in enumerate(a) if value > 2] [2, 5]
When in Matlab I can write:
>> a = [1, 2, 3, 1, 2, 3]; >> find(a>2) ans = 3 6
Is there a short hand method of writing this in Python, or do I just stick with the long version?
Thank you for all the suggestions and explanation of the rationale for Python's syntax.
After finding the following on the numpy website, I think I have found a solution I like:
Applying the information from that website to my problem above, would give the following:
>>> from numpy import array >>> a = array([1, 2, 3, 1, 2, 3]) >>> b = a>2 array([False, False, True, False, False, True], dtype=bool) >>> r = array(range(len(b))) >>> r(b) [2, 5]
The following should then work (but I haven't got a Python interpreter on hand to test it):
class my_array(numpy.array): def find(self, b): r = array(range(len(b))) return r(b) >>> a = my_array([1, 2, 3, 1, 2, 3]) >>> a.find(a>2) [2, 5]
In Python, you wouldn't use indexes for this at all, but just deal with the values—
[value for value in a if value > 2]. Usually dealing with indexes means you're not doing something the best way.
If you do need an API similar to Matlab's, you would use numpy, a package for multidimensional arrays and numerical math in Python which is heavily inspired by Matlab. You would be using a numpy array instead of a list.
>>> import numpy >>> a = numpy.array([1, 2, 3, 1, 2, 3]) >>> a array([1, 2, 3, 1, 2, 3]) >>> numpy.where(a > 2) (array([2, 5]),) >>> a > 2 array([False, False, True, False, False, True], dtype=bool) >>> a[numpy.where(a > 2)] array([3, 3]) >>> a[a > 2] array([3, 3])