а, сейчас напишу :) там все просто должно быть, главное, с индексами не ошибиться — ну да вы и потестируете, если что :)
ну, points я мерял просто за компанию. понятно, что distances ~ O(points^2)
. кстати, странно, что у вас sys.getsizeof() дает 80 — попробуйте тогда points.nbytes, это точно должно работать.
в общем, если памяти все равно не хватает, то minibatch вам в помощь. разбиваем points на несколько сегментов, и для каждого считаем pdist() между точками внутри сегмента, и cdist() между точками этого сегмента и остальных. будет, конечно, не так быстро, как один pdist(), но наверняка намного быстрее обработки каждой пары отдельно.
+1 за class-central.com
а у стенфорда есть еще online.stanford.edu/courses/allcourses
как вариант, кстати, если все данные не получается за раз засунуть в один вызов pdist()
, можно соорудить minibatch из pdist()
и cdist()
.
ну, по крайней мере, для входных данных можно объем памяти уменьшить:
arr_size = (10000, 20)
points = np.zeros(arr_size, dtype=np.float16)
points[:] = np.random.standard_normal(arr_size)
print sys.getsizeof(points)
400112

points = np.random.standard_normal(arr_size) # dtype=float64
print sys.getsizeof(points)
1600112

впрочем, 1.6M против 400K — не думаю, что это может вызвать какие-либо проблемы.
А pdist()
, похоже, всегда возвращает float64
:
distances = dist.pdist(points)
print sys.getsizeof(points)
399960096
результат можно сжать во float16
, используя тот же прием:
n = len(points)
distances = np.zeros(int(n * (n - 1) / 2), dtype=np.float16)
distances[:] = dist.pdist(points)
print sys.getsizeof(points)
99990096
объем памяти, кстати, не такие уж большой — ~400M максимум. может, у вас там какие-то лишние временные объекты память отъедают?
Сорри я сейчас без компа, но попробуй сделать dtype=float16 для входных данных, и/или оставлять только n наименьших расстояний — и то, и другое есть в моём первом примере
о, нашел. все, что вам нужно — scipy.spatial.distance.pdist()
:
import numpy as np
import scipy.spatial.distance as dist
points = np.random.randn(10000, 20)
distances = dist.pdist(points, metric='euclidean')
считает все расстояния за 1.3 сек на моем лаптопе. batteries included, что называется :)
дык где numpy, там и pandas.. а у вас в векторе есть еще какие-то фичи? если нет, то используйте numpy и не парьтесь
+1 за numpy и по скорости, и по памяти. можно еще использовать numpy.float16 или какой-нибудь int для экономии памяти.
а, кстати, точно нужно вычислять все попарные расстояния, или достаточно, скажем, найти 10 ближайших точек? тогда можно сделать что-то вроде
import numpy as np
import heapq
arr_size = (10000, 1000)
points = np.zeros(arr_size, dtype=np.float16)
points[:] = np.random.standard_normal(arr_size)
def closest_n(n, points):
return heapq.nsmallest(n, (
(np.linalg.norm(points[i] - points[j]), i, j)
for i in xrange(len(points))
for j in xrange(i + 1, len(points))))
подойдет такое?
PowerShell:
(((65..90) | %{ Invoke-WebRequest ("httрs://www.linkedin.сom/ta/skill?query=" + [char]$_) }).Content | ConvertFrom-Json).resultList.displayName
A++
Account Management
Analysis
Business Analysis
Advertising
Financial Analysis
Accounting
AutoCAD
Data Analysis
Online Advertising
. . .
(только поправьте URL — я там русские буквы вставил, чтобы он в ссылку не преобразовывался)
добавлю от себя $0.02:
0) git remote add cart ...
добавляет не ветку, а ссылку на удаленный репозиторий на гитхабе, который на вашей машине отныне будет проходить под именем cart. т.е. у вас теперь есть ветка cart и ссылка на удаленный репозиторий, который тоже называется cart
1) команда git push
имеет формат: git push [repo] [branch]
по умолчанию, repo == «origin», а branch зависит от настроек. в старых версиях, если ветка явно не указывалась, гит пушал *все* локальные ветки, которым находилось соответствие на удаленном репозитории. из-за этого не очень опытные (а иногда и опытные) пользователи преиодически наступали на грабли и пушали на удаленный сервер ветки, которые совсем не надо было пушать.
такое поведение гита называется push policy == matching. с версии 2.0 политика поменялась, и теперь по умолчанию предлагается пушать только текущую ветку (push policy == simple).
2) для верности гит предлагает вам самостоятельно выбрать пуш полиси по умолчанию. как тут уже посоветовали умные люди, просто один раз скажите
git config -global push.default simple
чтобы ненароком не пушнуть лишнего, да и вообще выработайте привычку всегда указывать и репозиторий, и ветку явно. в вашем случае это будет git push cart cart
(не очень, кстати, удобное название для репозитория)
3) пользоваться командной строкой — это хорошо и правильно. иначе фиг бы кто тут помог разобраться, какую там кнопочку в гуи вы не так нажали
сорри, не понял, что речь идет про деплоймент. тогда, если дерево исходников совпадает с тем, что на сервере, то rsync. иначе — можно попробовать git diff --names-only
и rsync/scp.
как насчет git format-patch / git apply / git am
?
размер захромал в конце. «но все ж иногда есть свободная касса» — так лучше, имно.
crowdsource poetry FTW! :)
Hello from curl
проверка
ну или для начала хотя бы писать от своего реального имени
у меня есть небольшой положительный опыт с PostgreSQL + PostGIS. имно, если основные данные и так хранятся в постгресе, то это вполне приемлемый вариант. правда, в нашем случае мы поняли, что данных у нас не так много, и можно тупо держать в памяти trie + geohash. у нас, правда, координаты не менялись. впрочем, если координаты меняются незначительно (например, мы отслеживаем движущийся объект), то префикс geohash тоже будет меняться не так сильно, а следовательно, апдейтить (и, соответственно, лочить) нужно будет только часть trie. в общем, поэкспериментируйте с geohash, и поделитесь впечатлениями потом.
якось так..