2014-01-31 3 views
3

Я создал массив таким образом, как показано ниже; который представляет собой 3 пары координат. Моя проблема заключается в том, что я, похоже, не могу найти индекс определенной пары координат внутри массива.Как найти индекс массива в массиве

import numpy as np 

R = np.random.uniform(size=(3,2)) 

R 

Out[5]: 
array([[ 0.57150157, 0.46611662], 
    [ 0.37897719, 0.77653461], 
    [ 0.73994281, 0.7816987 ]]) 

R.index([ 0.57150157, 0.46611662]) 

возвращается следующее:

AttributeError: 'numpy.ndarray' object has no attribute 'index' 

Поэтому я пытаюсь сделать это, так что я могу расширить список, с индексом пары координат, в для- петля.

например.

v = [] 
for A in R: 
v.append(R.index(A)) 

Я просто не уверен, почему функция индекса не работает и не может найти способ обойти ее.

Я новичок в программировании, поэтому извините меня, если это похоже на вздор.

ответ

2

Вы можете достичь желаемого результата, преобразуя свои внутренние массивы (координаты) в кортежи.

R = map(lambda x: (x), R); 

А затем вы можете найти индекс кортежа с использованием R.index ((number1, number2));

Надеюсь, это поможет!

[Изменить] Чтобы объяснить, что происходит в приведенном выше коде, функция карты проходит через (итерации) элементы в массиве R и для каждого заменяет его результатом возврата функции лямбда. Так что эквивалентно что-то вдоль этих линий:

def someFunction(x): 
    return (x) 

for x in range(0, len(R)): 
    R[x] = someFunction(R[x]) 

Так он принимает каждый элемент и делает что-то к нему, положить его обратно в список. Я понял, что на самом деле он не может сделать то, что, как я думал, (return (x), похоже, не изменяет регулярный массив на кортеж), но это помогает вашей ситуации, потому что, по-моему, путем итерации через нее python может создать регулярный массив из массива numpy.

Чтобы реально преобразовать в кортеж, следующий код должен работать

R = map(tuple, R) 

(кредиты https://stackoverflow.com/a/10016379/2612012)

1

Numpy массивы не индексная функция, по целому ряду причин. Однако, я думаю, вы хотите чего-то другого.

Например, код, который вы упомянули:

v = [] 
for A in R: 
    v.append(R.index(A)) 

бы просто быть (при условии R имеет уникальные строки, на данный момент):

v = range(len(R)) 

Однако, я думаю, вы могли бы желая встроенная функция enumerate. Например.

for i, row in enumerate(R): 
    # Presumably you're doing something else with "row"... 
    v.append(i) 

Например, предположим, что мы хотели знать инди, где сумма каждой строки была больше 1.

Один из способов сделать это будет:

v = [] 
for i, row in enumerate(R) 
    if sum(row) > 1: 
     v.append(i) 

Однако NumPy также другие способы сделать это, если вы работаете с Numpy массивами. Например, эквивалент кода выше будет:

v, = np.where(R.sum(axis=1) > 1) 

Если вы только начали с питоном, сосредоточиться на понимании первый пример, прежде чем слишком беспокоиться о том, как лучше сделать что-то с NumPy. Просто имейте в виду, что массивы numpy ведут себя очень иначе, чем списки.

6

index() - это метод типа list, а не numpy.array. Попробуйте:

R.tolist().index(x) 

Где x это, например, третий ввод R. Сначала конвертируйте ваш массив в list, затем вы можете использовать index;)

Смежные вопросы