2015-05-19 2 views
1

Скажем, у меня есть массив numpy с формой (2,3), заполненной поплавками.Создание Numpy-массивов без итерации в Python

Мне также нужен массив всех возможных комбинаций значений X и Y (их соответствующее положение в массиве). Есть ли что-то вроде функции simpe для получения индексов в виде кортежа из массива numpy, в котором мне не нужно, чтобы for-loop выполняли итерацию по массиву?

Пример кода:

arr=np.array([np.array([1.0,1.1,1.2]), 
       np.array([1.0,1.1,1.2])]) 
indices=np.zeros([arr.shape[0]*arr.shape[1]]) 

#I want an array of length 6 like np.array([[0,0],[0,1],[0,2],[1,0],[1,1], [1,2]]) 
#Code so far, iterates though :(
ik=0 
for i in np.arange(array.shape[0]): 
    for k in np.arange(array.shape[1]): 
     indices[ik]=np.array([i,k]) 
     ik+=1 

Теперь после этого, я также хочу сделать массив с длиной массиву «Индексы», содержащий «XYZ координаты», как и в каждом элементе, содержащем «индексы» ХУ и значение Z из 'arr'. Есть ли более простой способ (и, если это возможно без повторного переборе массивов), чем это:

xyz=np.zeros(indices.shape[0]) 
for i in range(indices.shape[0]): 
    xyz=np.array([indices[i,0],indices[i,1],arr[indices[i,0],indices[i,1]] 

ответ

0

Есть, вероятно, много способов для достижения этой цели ... Возможное решение заключается в следующем.

Первая проблема может быть решена с помощью np.unravel_index

max_it = arr.shape[0]*arr.shape[1] 
indices = np.vstack(np.unravel_index(np.arange(max_it),arr.shape)).T 

Второй массив может быть построен с

xyz = np.column_stack((indices,arr[indices[:,0],indices[:,1]])) 

таймингов

На массиве timeit дает для моего кода 10000 loops, best of 3: 27.7 µs per loop (требуется решение grc 10000 loops, best of 3: 39.6 µs per loop)

На больших массивах с shape=(50,60) у меня есть 1000 loops, best of 3: 247 µs per loop (решение GRC нуждается 100 loops, best of 3: 2.17 ms per loop)

0

Для ваших индексов:

indices = np.concatenate((np.meshgrid(range(arr.shape[0]), range(arr.shape[1]))) 
2

Вы можете использовать np.ndindex:

indices = np.ndindex(arr.shape) 

Это даст итератор а не массив, но вы можете легко преобразовать его в список:

>>> list(indices) 
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)] 

Тогда вы можете сложить индексы с исходным массивом по 2-ю размера:

np.hstack((list(indices), arr.reshape((arr.size, 1)))) 
Смежные вопросы