Вот несколько решений:
В любом случае используйте np.argsort
, ведь это быстро скомпилированный код.
Используйте np.bincount
, чтобы получить размеры бинов, и np.argpartition
, что составляет O(n)
для фиксированного количества бинов. Недостаток: в настоящее время нет стабильного алгоритма, поэтому мы должны отсортировать каждую ячейку.
Использовать scipy.ndimage.measurements.labeled_comprehension
. Это примерно соответствует тому, что требуется, но не знаю, как это реализовано.
Использовать pandas
. Я полный pandas
нуб, так что то, что я здесь собрал, используя groupby
, может быть неоптимальным.
Использование scipy.sparse
переключения между форматами сжатых разреженных строк и сжатых разреженных столбцов позволяет реализовать именно ту операцию, которую мы ищем.
Используйте pythran
(я уверен, что numba
также работает) в цикличном коде в вопросе. Все, что требуется, это вставить в начало после импорта numpy
.
#pythran export sort_to_bins(int[:], float[:], int)
, а затем компилировать
# pythran stb_pthr.py
Тесты 100 бинов, переменное количество элементов:
[1137 ] Возьмите домой:
Если вы согласны с numba
/ pythran
, то это путь, если нет scipy.sparse
, то масштабируется довольно хорошо.
Код:
import numpy as np
from scipy import sparse
from scipy.ndimage.measurements import labeled_comprehension
from stb_pthr import sort_to_bins as sort_to_bins_pythran
import pandas as pd
def sort_to_bins_pandas(idx, data, mx=-1):
df = pd.DataFrame.from_dict(data=data)
out = np.empty_like(data)
j = 0
for grp in df.groupby(idx).groups.values():
out[j:j+len(grp)] = data[np.sort(grp)]
j += len(grp)
return out
def sort_to_bins_ndimage(idx, data, mx=-1):
if mx==-1:
mx = idx.max() + 1
out = np.empty_like(data)
j = 0
def collect(bin):
nonlocal j
out[j:j+len(bin)] = np.sort(bin)
j += len(bin)
return 0
labeled_comprehension(data, idx, np.arange(mx), collect, data.dtype, None)
return out
def sort_to_bins_partition(idx, data, mx=-1):
if mx==-1:
mx = idx.max() + 1
return data[np.argpartition(idx, np.bincount(idx, None, mx)[:-1].cumsum())]
def sort_to_bins_partition_stable(idx, data, mx=-1):
if mx==-1:
mx = idx.max() + 1
split = np.bincount(idx, None, mx)[:-1].cumsum()
srt = np.argpartition(idx, split)
for bin in np.split(srt, split):
bin.sort()
return data[srt]
def sort_to_bins_sparse(idx, data, mx=-1):
if mx==-1:
mx = idx.max() + 1
return sparse.csr_matrix((data, idx, np.arange(len(idx)+1)), (len(idx), mx)).tocsc().data
def sort_to_bins_argsort(idx, data, mx=-1):
return data[idx.argsort(kind='stable')]
from timeit import timeit
exmpls = [np.random.randint(0, K, (N,)) for K, N in np.c_[np.full(16, 100), 1<
Как насчет просто:
Это преобразовывает Ваш оригинал в:
"1464885","LEVER WM","","B","MP17"
"1465075",":PLT-BC !!NOTE!!","","B",""
"1465076","BRKT-STR MTR !NOTE!","","B",""
"1465172",":BRKT-SW MTG !NOTE!","","B","MP16"
"1465388","BUSS BAR !NOTE!","","B","MP10"
"1465391","PLT-BLKHD ""NOTE""","","B","MP20"
"1465564","SPROCKET:13TEETH,74MM OD,66MM","ID W/.25"" SETSCR","B","MP6"
"S01266330002","CABLE:224'';E122/261,8 CO","","B","MP11"
Который, кажется, подвергается резкой критике прекрасный в SSIS. Вы можете иметь к шагу 3 рекурсивно для составления 3 пустых полей подряд ('''';'';; и т.д.), но нижняя строка здесь - то, что при встраивании текстовых спецификаторов необходимо или выйти из них или заменить их. Позвольте это быть уроком в Вашем создании CSV обрабатывает продвижение.
Я просто сделал бы поиск/замену" и заменил бы его,
У Вас есть доступ к исходному файлу?
У меня были БОЛЬШИЕ проблемы с SSIS. SSIS подавляет то, что Access, Excel и даже DTS делают очень хорошо. Данные переменной длины записи - еще одна проблема, но да, эти встроенные квалификаторы представляют собой серьезную проблему. Особенно, если у вас нет доступа к файлам импорта, потому что они находятся на чужом сервере, доступ к которому вы платите, и который может иметь размер от 4 до 5 ГБ! Не могу просто «заменить все» при каждом импорте.
Вы можете проверить это на сайте загрузок Microsoft под названием « UnDouble », и вот еще один обходной путь , который вы можете попробовать .
Похоже, что с SSIS в SQL Server 2008 ошибка все еще существует. Я не знаю, почему они не обратились к этому в анализаторе, но это похоже на то, что мы вернулись во времени с SSIS в базовой функции импорта.
ОБНОВЛЕНИЕ 18.11.2010: Эта ошибка все еще существует в SSIS. Поразительно.