returns the coordinates of a numpy array given the index and the shape. A first_index_et function is given as example code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | # -*- coding: utf-8 -*-
"""
Created on Fri Oct 05 13:32:06 2012
@author: Garrett Berg
"""
import numpy as np
import itertools
import math
def index_to_coords(index, shape):
'''convert index to coordinates given the shape'''
coords = []
for i in xrange(1, len(shape)):
divisor = int(np.product(shape[i:]))
value = index//divisor
coords.append(value)
index -= value * divisor
coords.append(index)
return tuple(coords)
def first_coords_et(data_matrix, value, start = 0):
'''the first coordinates that are equal to the value'''
index = first_index_et(data_matrix.flatten(), value, start)
shape = data_matrix.shape
return index_to_coords(index, shape)
def first_index_et(data_list, value, start = 0):
data_list = itertools.islice(data_list, start, None)
'''same as data_list.index(value), except with exception handling
Also finds 'nan' values and works with numpy arrays -- quickly!'''
try:
if type(value) == float and math.isnan(value):
floats = (float, np.float64, np.float32, np.float96)
isnan = math.isnan
return next(data[0] for data in enumerate(data_list)
if (type(data[1]) in floats
and isnan(data[1]))) + start
else:
return next(data[0] for data in
enumerate(data_list) if data[1] == value) + start
except (ValueError, StopIteration): return - 1
if __name__ == '__main__':
ab = np.arange(0, 30000)
ab.shape = (20, 20, 30000/(20*20))
value = ab[7][12][0]
print first_coords_et(ab, value)
# (7, 12, 0)
|