Найти элемент массива эффективным способом - PullRequest
0 голосов
/ 23 декабря 2018

Итак, у меня есть массив n (n), который выглядит следующим образом:

  [[1, 2, 20.1, 20.0],
  [1, 4, 22.1, 21.0],
  [1, 9, 25.1, 20.0],
  [1, 12, 27.1, 22.0]]

В основном первые два числа (1,2) (1,4) (1,9) (1,12) представляют х и у.Два других (20.1, 20.00) представляют два других количества.

Я бы хотел получить доступ к массиву таким образом, чтобы:

b[1,2,0] = 20.1
b[1,2,1] = 20.0   
b[1,4,0] = 22.1  
b[1,4,1] = 21.0

Насколько я знаю, существует возможность использования структурированных массивов.Но есть ли другой способ сделать это?

Ответы [ 3 ]

0 голосов
/ 23 декабря 2018

Другой вариант с использованием numpy.where путем условной индексации.Просто определяет метод, который напрямую обращается к массиву:

import numpy as np

b = np.array([[1, 2, 20.1, 20.0],
             [1, 4, 22.1, 21.0],
             [1, 9, 25.1, 20.0],
             [1, 12, 27.1, 22.0]])

def pick_up(h, k, i=0):
  return b[np.where( (b[:,0] == h) & (b[:,1] == k) )][0,i+2]

pick_up(1, 9, 0) #=> 25.1
pick_up(1, 12, 1) #=> 22.0
0 голосов
/ 23 декабря 2018

Настройка

a = np.array([[ 1. ,  2. , 20.1, 20. ],
              [ 1. ,  4. , 22.1, 21. ],
              [ 1. ,  9. , 25.1, 20. ],
              [ 1. , 12. , 27.1, 22. ]])

Это довольно стандартная операция с клочками.Если ваш входной массив становится очень большим, я бы порекомендовал изучить разреженную матрицу scipy, но для вашего случая использования массива вполне подойдет.Общая идея состоит в том, чтобы создать массив формы (maxx, maxy, 2) и использовать присвоение NumPy для заполнения:

s = a[:, :2].astype(int)
x, y = s.T
m, n = s.max(0) + 1
z = np.zeros((m, n, 2))
z[x, y] = a[:, 2:]

Теперь просто получите доступ к z так, как вы хотите:

>>> z[1, 2, 0]
20.1
0 голосов
/ 23 декабря 2018

Вы хотите преобразовать свой массив (который использует индексирование в стиле индексирования) в словарь (который использует индексирование в стиле 3-кортежа):

a = {}
for i in range(len(b)):
    a[b[i][0], b[i][1], 0] = b[i][2]
    a[b[i][0], b[i][1], 1] = b[i][3]

Требуемый словарь будет в a

РЕДАКТИРОВАТЬ: я предполагаю, что b[1, 2, 1] должно быть 20.0, а не 20.9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...