Строковые сравнения между двумя массивами

1

Я новичок в Numpy и Python, и у меня есть вопросы. Я надеюсь, что вы могли бы помочь мне.

Скажем, у меня есть два массива. Оба массива имеют 11 столбцов, причем первый столбец является индексом.

Это пример array1. Кстати, array1 - это постоянно обновляемый массив live.

[(0, 537, 504, 547, 560, 553,  -92, -5132, 15972, 1, 1)
 (0, 537, 504, 547, 559, 553, -100, -5128, 16108, 1, 1)
 (0, 537, 504, 547, 560, 553, -124, -5088, 16092, 1, 1)
 (0, 537, 504, 547, 559, 553, -140, -5160, 16164, 1, 1)
 (0, 537, 504, 547, 560, 552, -112, -5320, 16072, 1, 1)
 (0, 537, 504, 547, 560, 552,  -24, -5092, 16092, 1, 1)
 (0, 537, 504, 547, 560, 551, -148, -5104, 16108, 1, 1)
 (0, 537, 504, 547, 560, 551,  -92, -5136, 16092, 1, 1)
 (0, 537, 504, 547, 560, 551,    4, -5032, 16076, 1, 1)
 (0, 537, 504, 547, 560, 551,  -60, -5096, 15944, 1, 1)
 (0, 537, 504, 547, 560, 552,  -48, -5084, 16072, 1, 1)
 (0, 537, 504, 547, 560, 552,  -48, -5084, 16072, 1, 1)
 (0, 537, 504, 547, 560, 552,  -48, -5084, 16072, 1, 1)
 (0, 537, 504, 547, 560, 552,  -48, -5084, 16072, 1, 1)]

Я хочу сравнить значение последней строки array1 со всеми строками array2. (Это должна быть последняя строка массива1, поскольку его содержимое будет поступать из постоянно обновляемого файла CSV). Я хочу найти значения ближайших строк между столбцами без меток последней строки array1 и всеми строками без меток array2. Метка в массиве будет нулевой и не будет учитываться при сравнении. Это не должно быть точное совпадение, но я хочу, чтобы оно находило наиболее близкое совпадение в пределах установленного допуска. Массив 2 будет служить своего рода словарем, метки которого будут служить справочной информацией, а функции в ряду тех отдельных меток, которые будут служить образцами. Я иду об этом правильно или есть более подходящий способ для достижения этого? Я намереваюсь иметь 26 различных типов меток, представляющих 26 букв алфавита в массиве 2, каждая с определенным набором функций столбцов. Эти 26 типов меток будут иметь 10 рядов образцов в каждой. Диапазон допуска должен указываться этими 10 образцами на этикетке. Вот пример данных CSV в массиве 2 (которые я уже мог преобразовать в массивы).

LABEL,F1,F2,F3,F4,F5,X,Y,Z,C1,C2

1, 537, 504, 547, 560, 553, -92, -5132, 15972, 1, 1

1, 537, 504, 547, 559, 553, -100, -5128, 16108, 1, 1

1, 537, 504, 547, 560, 553, -124, -5088, 16092, 1, 1

1, 537, 504, 547, 559, 553, -140, -5160, 16164, 1, 1

1, 537, 504, 547, 560, 552, -112, -5320, 16072, 1, 1

1, 537, 504, 547, 560, 552, -24, -5092, 16092, 1, 1

1, 537, 504, 547, 560, 551, -148, -5104, 16108, 1, 1

1, 537, 504, 547, 560, 551, -92, -5136, 16092, 1, 1

1, 537, 504, 547, 560, 551, 4, -5032, 16076, 1, 1

1, 537, 504, 547, 560, 551, -60, -5096, 15944, 1, 1

2, 537, 504, 547, 560, 553, -92, -5132, 15972, 0, 0

2, 537, 504, 547, 559, 553, -100, -5128, 16108, 0, 0

2, 537, 504, 547, 560, 553, -124, -5088, 16092, 0, 0

2, 537, 504, 547, 559, 553, -140, -5160, 16164, 0, 0

2, 537, 504, 547, 560, 552, -112, -5320, 16072, 0, 0

2, 537, 504, 547, 560, 552, -24, -5092, 16092, 0, 0

2, 537, 504, 547, 560, 551, -148, -5104, 16108, 0, 0

2, 537, 504, 547, 560, 551, -92, -5136, 16092, 0, 0

2, 537, 504, 547, 560, 551, 4, -5032, 16076, 0, 0

2, 537, 504, 547, 560, 551, -60, -5096, 15944, 0, 0

1 - это A, а 2 - это B. Как видите, их единственными отличиями являются 1 и 0 в последних двух столбцах. Тем не менее, другие буквы алфавита будут иметь различия в нескольких столбцах, поэтому я хочу, чтобы последняя строка в массиве 1 искала свое самое близкое соответствие в массиве 2.

Я хочу провести коллективное построчное сравнение двух массивов.

В конце я хочу напечатать метку массива 2, функции которого наиболее близки к функции последней строки массива 1. И поскольку входные данные в array1 будут постоянно обновляться, если последняя строка в array1 изменится в значениях и будет соответствовать другой метке, я хочу, чтобы она также обновлялась соответствующим образом в реальном времени.

Опять же, я новичок в Python и Numpy, я не знаю, правильно ли я подхожу к этому. Я надеюсь, что вы можете мне помочь. Заранее спасибо. Я был бы очень признателен за любую помощь.

Теги:
dataframe
arrays
numpy
python-2.7

1 ответ

0
Лучший ответ

Ваш массив A и B:

 A = np.array([(0, 537, 504, 547, 560, 553,  -92, -5132, 15972, 1, 1),
 (0, 537, 504, 547, 559, 553, -100, -5128, 16108, 1, 1),
 (0, 537, 504, 547, 560, 553, -124, -5088, 16092, 1, 1),
 (0, 537, 504, 547, 559, 553, -140, -5160, 16164, 1, 1),
 (0, 537, 504, 547, 560, 552, -112, -5320, 16072, 1, 1),
 (0, 537, 504, 547, 560, 552,  -24, -5092, 16092, 1, 1),
 (0, 537, 504, 547, 560, 551, -148, -5104, 16108, 1, 1),
 (0, 537, 504, 547, 560, 551,  -92, -5136, 16092, 1, 1),
 (0, 537, 504, 547, 560, 551,    4, -5032, 16076, 1, 1),
 (0, 537, 504, 547, 560, 551,  -60, -5096, 15944, 1, 1),
 (0, 537, 504, 547, 560, 552,  -48, -5084, 16072, 1, 1),
 (0, 537, 504, 547, 560, 552,  -48, -5084, 16072, 1, 1),
 (0, 537, 504, 547, 560, 552,  -48, -5084, 16072, 1, 1),
 (0, 537, 504, 547, 560, 552,  -48, -5084, 16072, 1, 1)])

 B = np.array([[1, 537, 504, 547, 560, 553, -92, -5132, 15972, 1, 1],
[1, 537, 504, 547, 559, 553, -100, -5128, 16108, 1, 1],
[1, 537, 504, 547, 560, 553, -124, -5088, 16092, 1, 1],
[1, 537, 504, 547, 559, 553, -140, -5160, 16164, 1, 1],
[1, 537, 504, 547, 560, 552, -112, -5320, 16072, 1, 1],
[1, 537, 504, 547, 560, 552, -24, -5092, 16092, 1, 1],
[1, 537, 504, 547, 560, 551, -148, -5104, 16108, 1, 1],
[1, 537, 504, 547, 560, 551, -92, -5136, 16092, 1, 1],
[1, 537, 504, 547, 560, 551, 4, -5032, 16076, 1, 1],
[1, 537, 504, 547, 560, 551, -60, -5096, 15944, 1, 1],
[2, 537, 504, 547, 560, 553, -92, -5132, 15972, 0, 0],
[2, 537, 504, 547, 559, 553, -100, -5128, 16108, 0, 0],
[2, 537, 504, 547, 560, 553, -124, -5088, 16092, 0, 0],
[2, 537, 504, 547, 559, 553, -140, -5160, 16164, 0, 0],
[2, 537, 504, 547, 560, 552, -112, -5320, 16072, 0, 0],
[2, 537, 504, 547, 560, 552, -24, -5092, 16092, 0, 0],
[2, 537, 504, 547, 560, 551, -148, -5104, 16108, 0, 0],
[2, 537, 504, 547, 560, 551, -92, -5136, 16092, 0, 0],
[2, 537, 504, 547, 560, 551, 4, -5032, 16076, 0, 0],
[2, 537, 504, 547, 560, 551, -60, -5096, 15944, 0, 0]])

Разница между B и последним рядом A

D = B - A[-1]

"Ближайший" - это всегда обсуждение, но, скажем, вы хотите, чтобы сумма абсолютных значений была минимальной.

np.abs(D).sum(axis=1).argmin()

Это дает строку 5 наиболее близко.

B[np.abs(D).sum(axis=1).argmin()] дает:

array([    1,   537,   504,   547,   560,   552,   -24, -5092, 16092,
           1,     1])
  • 0
    Сэр, я попытался поиграть с вашим кодом, и они работают соответственно. Спасибо большое, сэр! У меня есть вопрос новичка. Как сделать так, чтобы обновление моего «массива А» постоянно работало (поскольку оно основано на постоянно обновляемом csv fie)? Кроме того, при этом, как я могу позволить выводу отображаться и изменяться в зависимости от новых входов, которые он будет получать постоянно?
  • 0
    Это оба отдельные вопросы, для которых я предлагаю создать новые вопросы о переполнении стека. Я предлагаю сосредоточиться на чтении последней строки файла по мере его обновления. Вам не нужно поддерживать целый массив, а только последнюю строку. Что касается второго вопроса, это полностью зависит от того, как вы хотите, чтобы обновление выглядело. Вы думаете, инструмент командной строки или что-то с графическим интерфейсом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню