Если вы не возражаете против своих данных, используя канал ('|') в качестве разделителя, вы можете попробовать использовать флаг -e
в cqlsh. Флаг -e
позволяет вам отправить запрос в Cassandra из командной строки, где вы можете перенаправить или даже выполнить grep / awk / whatever на вашем выходе.
$ bin/cqlsh -e'SELECT video_id,title FROM stackoverflow.videos' > output.txt
$ cat output.txt
video_id | title
--------------------------------------+---------------------------
2977b806-df76-4dd7-a57e-11d361e72ce1 | Star Wars
ab696e1f-78c0-45e6-893f-430e88db7f46 | The Witches of Whitewater
15e6bc0d-6195-4d8b-ad25-771966c780c8 | Pulp Fiction
(3 rows)
Старые версии cqlsh don У меня есть флаг -e
. Для более старых версий cqlsh вы можете поместить свою команду в файл и использовать флаг -f
.
$ echo "SELECT video_id,title FROM stackoverflow.videos;" > select.cql
$ bin/cqlsh -f select.cql > output.txt
Отсюда, при создании cat
на output.txt должны появляться те же строки как указано выше.
используется словарь, поэтому поиск будет быстрым. numpy
массивы являются изменяемыми и, следовательно, не могут быть хешируемыми, поэтому вам придется преобразовывать их, например, в кортежи для использования со словарем.
Используйте широковещательную проверку для проверки value_list
каждого «ключа» в key_list
векторизованным способом. Это по крайней мере выведет циклы for из Python, но вам все равно придется сравнивать каждое значение с каждым ключом.
Здесь я также предполагаю, что key_list
имеет только уникальные «ключи».
Вот как вы могли бы сделать первый подход:
value_list = np.array([[2,2,3],[255,243,198],[2,2,3],[50,35,3]])
key_list = np.array([[2,2,3],[255,243,198],[50,35,3]])
key_map = {tuple(key): i for i, key in enumerate(key_list)}
result = np.array([key_map[tuple(value)] for value in value_list])
result # array([0, 1, 0, 2])
И вот второй:
result = np.where((key_list[None] == value_list[:, None]).all(axis=-1))[1]
result # array([0, 1, 0, 2])
Какой способ быстрее может зависеть от размера key_list
и [ 117]. Я бы выбрал для вас оба набора типичных размеров.
РЕДАКТИРОВАТЬ - как отмечалось в комментариях, второе решение не кажется полностью правильным, но я не уверен, что делает его неудачным. Попробуйте вместо этого использовать первое решение.
Допущения:
value_list
будет присутствовать в key_list
(в той или иной позиции) key_list
только для первого совпадения Решение:
Из из двух массивов мы создаем представления из 3-х кортежей. Затем мы транслируем два представления в двух ортогональных направлениях, а затем проверяем поэлементное равенство на транслируемых массивах.
import numpy as np
value_list = np.array([[2,2,3],[255,243,198],[2,2,3],[50,35,3]], dtype='uint8')
key_list = np.array([[2,2,3],[255,243,198],[50,35,3]], dtype='uint8')
# Define a new dtype, describing a "structure" of 3 uint8's (since
# your original dtype is uint8). To the fields of this structure,
# give some arbitrary names 'first', 'sec', and 'third'
dt = np.dtype([('first', np.uint8, 1),('sec', np.uint8, 1),('third', np.uint8, 1)])
# Now view the arrays as 1-d arrays of 3-tuples, using the dt
v_value_list = value_list.view(dtype=dt).reshape(value_list.shape[0])
v_key_list = key_list.view(dtype=dt).reshape(key_list.shape[0])
result = np.argmax(v_key_list[:,None] == v_value_list[None,:], axis=0)
print (result)
Вывод:
[0, 1, 0, 2]
Примечания:
Хотя это чистое решение без видимых циклов он может иметь скрытую неэффективность, потому что он сопоставляет каждый элемент value_list
с каждым элементом key_list
, в отличие от поиска на основе цикла, который интеллектуально останавливается при первом успешном сопоставлении. Любое полученное преимущество будет зависеть от фактического размера key_list
, а также от того, где происходят успешные совпадения, в key_list
. По мере роста размера key_list
, может быть некоторое размывание преимущества NumPy, особенно если успешные совпадения происходят в основном в более ранней части key_list
.
Представления, которые мы создаем, на самом деле являются простыми структурированными массивами, где каждый элемент представления представляет собой структуру из двух int
с. Один интересный вопрос, который я еще не исследовал, заключается в том, что, когда numpy сравнивает одну структуру с другой, выполняет ли она сравнение каждого поля в структуре или замыкает сравнение полей в первом ошибочном поле структура? Любое такое короткое замыкание может подразумевать небольшое дополнительное преимущество для этого решения со структурированным массивом.